使用 Docker 进行开发,我应该使用 ADD 还是 VOLUME?

Using Docker for development, should I use ADD or VOLUME?

我开始在项目上使用 Docker,这些项目中的大多数 运行 都在 PHP 上(一些在 Nginx/PHP-FPM 上,一些在 Apache/PHP作为模块)。

问题是:我的大脑无法理解何时在 Docker 文件上使用 ADD 和 VOLUME 指令来获取包含源代码的路径。

我要的是:改一行代码,在容器端口访问浏览器,看看变化。依此类推,直到事情 运行 符合预期,然后我 "add" 将代码部署到机器上。这就是我的想法 Docker 运行s。我错了吗?

AFAIK,ADD 指令将给定路径上的文件复制到图像,而 VOLUME 指令只是说给定路径将由|挂载到主机上。

到目前为止,运行 我想到的事情:

  1. 通过ADD添加源代码文件,然后在命令行中使用“-v”开关将源代码挂载到ADD所用的同一路径。

  2. 使用 VOLUME,并处理两个不同的 Docker 文件:用于开发容器,以及用于 testing/development,并根据需要构建每个文件(我认为这会适得其反,我的心告诉我这不是它应该的工作方式)。

有人可以帮我解决这个问题吗?我的大脑无法掌握什么,我应该做什么(并理解)以利用我的 Docker 知识?

对于正在积极编辑代码的开发工作流程,您可以使用 VOLUME(或 运行 带有 -v 的容器)。要将容器构建到可以交付部署的映像中,您需要 ADD,但这是 2 个不同的用例,因此您可能需要 2 个不同的 Dockerfile,它们相似但略有不同。

这里是关键,所以你可以记住这一点:如果你想避免重复 docker build 命令,VOLUME 是你本地开发的朋友,因为你可以更改代码并测试你的更改,而无需等待 docker build.

您绝对想在开发中使用 VOLUME,除非您觉得每次想要编辑图像时都重建图像很有趣。同样,您希望在生产中使用 ADD,否则具有 docker 的不可变环境的整个想法就会出现 window.

为了避免处理两个单独的 Dockerfile 的麻烦,您可以将您的基础环境(即:除了添加您的应用程序之外的所有内容)放入一个 Dockerfile 并将其作为图像放在 Docker Hub (or just use an existing image, if you can find one that fits your needs). Then use something like Docker Compose在开发中(使用你之前制作的图像作为你的应用程序的容器,并将你的代码库安装为一个卷),以及一个超薄的 Dockerfile,它只是从那个 docker 图像扩展并添加你的代码库用于生产。

官方PHP image举例说明了两种可能的工作流程。

对于生产,您可以使用 Dockerfile 来构建包含您的代码的容器:

FROM php:5.6-apache
COPY src/ /var/www/html/

而对于开发,您 运行 具有引用本地文件系统的卷的容器:

docker run -it --rm --name my-php-dev -v "$PWD/src":/var/www/html php:5.6-apache