当我遇到“在撰写文件中定义构建”时,我正在阅读Quickstart: Compose and Django。好吧,我以前看过它,但是我对此感到好奇的是它的目的是什么?我就是听不到。
为什么我们不一次构建映像(或在需要时更新映像)并在不同的docker-compose
文件中多次使用它?
这里是Dockerfile
:
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
这是docker-compose.yml
:
version: '3'
web:
# <<<<
# Why not building the image and using it here like "image: my/django"?
# <<<<
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
您可能会说:“好吧,随心所欲!”我问的原因是因为我认为可能会有一些我不知道的好处。
PS:
答案 0 :(得分:1)
docker build
图像与在image:
文件中指定docker-compose.yml
和直接在build:
中指定docker-compose.yml
元数据之间没有技术上的区别。
使用docker-compose build
生成映像的好处与使用docker-compose up
运行容器的好处大致相同。如果您有一组复杂的-f path/Dockerfile --build-arg ...
选项,则可以将它们写在build:
块中,而不必重复编写。如果您需要构建多个自定义图像,那么docker-compose build
可以一次完成所有图像的构建。
在实践中,您经常会在容器上进行迭代,这意味着您将需要运行本地单元测试,然后重建映像,然后重新启动容器。能够通过docker-compose down; docker-compose up --build
驱动Docker端将比记住需要运行的所有单个docker build
命令更容易。
这是行不通的地方,如果您有一个自定义的基本图像。因此,如果您有一个my/base
映像,并且您的应用程序映像是FROM my/base
构建的,则需要显式运行
docker build -t my/base base
docker build -t my/app app
docker run ... my/app
Compose对多级docker-build
序列没有帮助;您将必须明确docker build
基础图像。