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
负责跳过不必要的操作(基于文件或资源的修改时间),所以你永远不会运行不必要的操作。