Docker撰写 - 从容器B中的容器A访问数据

时间:2016-08-07 17:58:32

标签: docker docker-compose

这是我的问题:

我有一个容器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}的新版本替换现有容器相比,它会导致相当长的停机时间}。

有没有适当的解决办法来实现我想要实现的目标?

1 个答案:

答案 0 :(得分:1)

我将重做工作流,使用安装在多个容器中的命名卷,其中一个容器是具有应用程序构建环境的更新程序。然后在启动时,更新程序从git中提取最新内容并将共享卷更新为CMDENTRYPOINT的一部分。

您的撰写文件类似于:

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也会再次启动更新程序。