zzxworld

Podman 导出镜像给 Docker 使用

我的本地开发环境和线上环境都采用了容器化的方式,目的是为了避免运行环境差异带来的各种繁琐步骤和麻烦问题。不过因为容器引擎的不同,还是免不了会出现一些问题。今天就碰到一个。

问题的起因是我准备把一个使用了 PHP:8.1-fpm 容器镜像的项目部署上线。本地 Podman 打包编译运行环境的自定义脚本一切正常。我把相同的脚本编写到 Dockerfile 并放到线上后,在 Docker 引擎下就出错了,经过精简打包代码,发现卡在编译 GD 这里过不去。

理论上不应该出现这种情况。虽然容器引擎不同,但都是从 Docker Hub 拉取的最新镜像,然后基于此镜像再安装自己需要的 PHP 扩展。只要打包脚本一致,一个能用,另外一个也应该能用。折腾了一上午,Docker 告诉我就是不行。期间还换了 Alpine 版本的镜像,还是一样的结果。本着优先解决工作事项的考虑,临时决定改变一下策略。

Podman 和 Docker 都支持容器镜像以文件的形式导入导出。所以既然本地 Podman 能正常编译打包镜像,那就把本地打包好的镜像导出成文件,然后把这个文件传到线上服务器,再通过 Docker 导入到镜像列表中。这样就绕开了线上编译打包镜像的步骤。

使用 Podman 打包好镜像后,导出镜像为文件格式的命令如下:

podman save > php8.1.tar php:8.1

php:8.1 是打包后镜像的命名。上面命令执行完成后,会在当前目录下生成一个文件名为 php8.1.tar 的文件。把这个文件传到线上服务器,然后通过以下 Docker 命令载入文件格式的镜像:

docker load < php8.1.tar

命令执行完成后,使用 docker images 就能查看到导入的镜像。接下来项目容器只要引用这个镜像即可,亲测可用。