在撰写文件中构建docker映像的目的是什么?

时间:2020-07-20 13:37:25

标签: docker docker-compose

当我遇到“在撰写文件中定义构建”时,我正在阅读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:

1 个答案:

答案 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基础图像。