我有一个docker-compose开发堆栈。当我运行docker-compose up --build
时,将构建容器并执行
Dockerfile:
RUN composer install --quiet
该命令将在./vendor/
目录中写入一堆文件,然后只能按预期在容器内部使用。主机上现有的vendor/
未被触及,因此已过时。
由于我使用该容器进行开发并希望我的更改可用,因此我将当前目录作为卷挂载到容器中:
搬运工-compose.yml:
my-app:
volumes:
- ./:/var/www/myapp/
这会将过时的vendor
目录加载到我的容器中;强迫我在主机或容器内重新运行composer install
以获得最新版本。
我想知道如何以不同方式管理我的docker-compose堆栈,以便在当前文件夹上构建docker期间的更改也会保留在主机目录中,并且我不必运行该命令两次。 / p>
我确实要保留vendor
文件夹,因为有些vendors
是我自己的,我希望能够在我当前的项目中修改它们。因此,仅安装运行我的应用程序所需的文件夹将不是最佳解决方案。
我正在寻找一种方法来告诉docker-compose:在添加音量之前,将容器内的所有内容写回主机。
答案 0 :(得分:2)
您可以在docker-compose build
之后运行短边容器:
docker run --rm -v /vendor:/target my-app cp -a vendor/. /target/.
cp
也可能像rsync
更有效率。然后在该容器退出之后,执行从主机安装/供应商的docker-compose up
。
答案 1 :(得分:1)
在添加卷之前,将容器内的所有内容写回主机。
没有任何方法可以直接执行此操作,但有一些选项可以作为第二个命令执行此操作。
docker cp
从容器中复制文件(不使用卷)vendor
,使用另一个映像来运行应用程序。这样,更新在主机上完成,但可以内置到最终图像中。 dobi
负责在工件仍然新鲜时(基于文件或资源的修改时间)跳过不必要的操作,因此您永远不会运行不必要的操作。