重建

时间:2016-10-12 19:39:12

标签: docker docker-compose dockerfile

想象一下两个容器:webserver(1)托管静态HTML文件,需要在数据卷容器(2)内构建模板。

docker-compose.yml文件看起来像这样:

version: "2"

services:
  webserver:
    build: ./web
    ports:
      - "80:80"
    volumes_from:
      - templates
  templates:
    build: ./templates
Dockerfile服务的

templates看起来像这样

FROM ruby:2.3
# ... there is more but that is should not be important
WORKDIR /tmp
COPY ./Gemfile /tmp/Gemfile
RUN bundle install
COPY ./source /tmp/source
RUN bundle exec middleman build --clean
VOLUME /tmp/build

当我运行docker-compose up时,一切都按预期工作:构建模板,webserver托管它们,您可以在浏览器中查看它们。

问题是,当我更新./source并重新启动/重建设置时,网络服务器托管的文件仍然是旧文件,尽管日志显示容器已重建 - 至少是后三层COPY ./source /tmp/source。因此,source文件夹中的更改会被重建所取代,但我无法获得浏览器中显示的更改。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

撰写preserves volumes when containers are recreated,这可能是您看到旧文件的原因。

通常,将卷用于源代码(或者在本例中为静态html文件)并不是一个好主意。卷用于要保留的数据,例如数据库中的数据。源代码随图像的每个版本而变化,因此不属于卷。

您可以使用builder容器来编译它们,而使用webserver服务来托管它们,而不是使用数据卷容器来存储这些文件。您需要向COPY webserver添加Dockerfile以包含这些文件。

要完成此操作,您需要将docker-compose.yml更改为:

version: "2"
services:
  webserver:
    image: myapp:latest
    ports: ["80:80"]

现在你只需要构建myapp:latest。你可以编写一个脚本:

  • 构建构建器容器
  • 运行构建器容器
  • 构建myapp容器

您还可以使用dobi之类的工具,而不是编写脚本(免责声明:我是此工具的作者)。有an example of building a minimal docker image与您尝试做的非常相似。

您的dobi.yaml可能如下所示:

image=builder:
  image: myapp-dev
  context: ./templates

job=templates:
  use: builder

image=webserver:
  image: myapp
  tags: [latest]
  context: .
  depends: [templates]

compose=serve:
  files: [docker-compose.yml]
  depends: [webserver]

现在,如果您运行dobi serve,它将为您执行所有步骤。只有在文件发生变化时才会运行每个步骤。