想象一下两个容器: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
文件夹中的更改会被重建所取代,但我无法获得浏览器中显示的更改。
我做错了什么?
答案 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
,它将为您执行所有步骤。只有在文件发生变化时才会运行每个步骤。