Docker构build后如何在主机上的容器内保留更改?

我有一个docker-compose dev stack。 当我运行时, docker-compose up --build ,容器将被build立并且它将被执行

Dockerfile:

 RUN composer install --quiet 

该命令将在./vendor/目录中写入一堆文件,然后只在容器中使用该文件。 主机上现有的vendor/也没有被触及,因此也是过时的。

由于我使用该容器进行开发,并希望我的更改可用,因此将容器中的当前目录作为一个卷装入:

泊坞窗,compose.yml:

 my-app: volumes: - ./:/var/www/myapp/ 

这将一个过时的vendor目录加载到我的容器中; 迫使我重新运行composer install在主机上或容器内,以获得最新版本。

我想知道如何以不同的方式pipe理我的docker-compose堆栈,以便docker build在当前文件夹期间的更改也保存在主机目录中,而不必执行两次。

我想保持vendor文件夹安装,因为有些vendors是我自己的,我喜欢能够修改他们在我目前的项目。 所以只有安装我需要运行我的应用程序的文件夹将不是最好的解决scheme。

我正在寻找一种方法来告诉docker-compose:在添加卷之前,将容器内的所有内容写回主机。

你可以在docker-compose build之后运行一个短边容器:

 docker run --rm -v /vendor:/target my-app cp -a vendor/. /target/. 

cp也可以像rsync一样更高效。 然后在那个容器退出之后,你做你的docker-compose up来自主机的安装/供应商。

在添加卷之前,将容器内的所有内容写回主机。

没有办法直接做到这一点,但有几个选项可以作为第二个命令。

  • 就像已经build议的那样,你可以运行一个容器并复制或rsync这些文件
  • 使用docker cp将文件从容器中复制出来(不使用卷)
  • 使用dobi这样的工具(免责声明:dobi是我自己的项目)来自动执行这些任务。 您可以使用一个映像更新vendor ,另一个映像运行该应用程序。 这种方式更新是在主机上完成的,但可以内置到最终的图像。 当工具仍然是新鲜的时候, dobi负责跳过不必要的操作(基于文件或资源的修改时间),所以你永远不会运行不必要的操作。