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

时间:2016-08-18 10:41:01

标签: docker docker-compose

我有一个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:在添加音量之前,将容器内的所有内容写回主机。

2 个答案:

答案 0 :(得分:2)

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

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

cp也可能像rsync更有效率。然后在该容器退出之后,执行从主机安装/供应商的docker-compose up

答案 1 :(得分:1)

  

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

没有任何方法可以直接执行此操作,但有一些选项可以作为第二个命令执行此操作。

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