这是我的问题:
我有一个容器A(Node.js)和一个容器B(nginx)。在容器A的Dockerfile中,我从源代码构建了几个文件,因为需要将服务器运行到名为build
的文件夹中。我想从容器B访问此文件夹以提供静态文件。
目的是拥有一个简单的工作流程,你可以用源代码克隆repo并运行docker-compose up --build
并且一切都在运行。在这种情况下,主机没有构建文件所需的软件,因此构建必须发生在docker容器内。
我的第一次尝试几乎是以下工作:
version: "2"
services:
nginx:
volumes_from:
- node
node:
volumes:
- /code/build
当我第一次建造docker compose build&一切似乎工作正常,容器是从容器A创建的,其中包含构建文件,容器B可以按预期访问它们。
但是,更新源时会出现问题。当它发生时,新的构建文件不会替换容器内的旧构建文件,因为现有容器似乎具有优先级。因此,在我第一次使用容器A和B的旧文件之后。
我研究了一种方法,每当我运行docker-compose build
但没有找到任何内容时,就会从头开始重新创建卷。我发现的唯一一件事就是使用docker-compose stop && docker-compose rm
,但每次都这样做似乎有些麻烦,而且与仅使用{{1}的新版本替换现有容器相比,它会导致相当长的停机时间}。
有没有适当的解决办法来实现我想要实现的目标?
答案 0 :(得分:1)
我将重做工作流,使用安装在多个容器中的命名卷,其中一个容器是具有应用程序构建环境的更新程序。然后在启动时,更新程序从git中提取最新内容并将共享卷更新为CMD
或ENTRYPOINT
的一部分。
您的撰写文件类似于:
version: "2"
volumes:
build:
driver: local
services:
nginx:
volumes:
- build:/code/build
updater:
volumes:
- build:/code/build
然后在任何更改时,您可以运行docker-compose run updater
并将它推送到您的卷的最新更改,而nginx可以在其中使用它而无需停止其他容器。由于它是一个退出的批处理作业,即使docker-compose up
也会再次启动更新程序。