为什么docker-compose在docker-compose up上构建新映像?

时间:2019-07-22 23:23:38

标签: python docker docker-compose

运行docker-compose up时,为什么要创建新图像?如何告诉docker-compose使用我刚创建的映像运行?我在这里做错了什么?

当我使用docker build . -t prod_srdc_web从干净的系统运行命令docker system prune -a时,一切都构建良好。构建图像后运行docker image ls时,我看到以下内容:

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
prod_srdc_web       latest              923538608c06        5 seconds ago        1.1GB
<none>              <none>              04b24dbf7c93        About a minute ago   4.23MB
python              3.7                 42d620af35be        9 days ago           918MB
alpine              3.7                 6d1ef012b567        4 months ago         4.21MB

运行docker-compose up后,所有内容将重新构建并启动容器。现在,docker image ps显示了一个具有新名称srdc_django_web的相同图像:

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
srdc_django_web     latest              7e75a841e0fd        About a minute ago   1.1GB
prod_srdc_web       latest              923538608c06        2 minutes ago        1.1GB
<none>              <none>              04b24dbf7c93        4 minutes ago        4.23MB
python              3.7                 42d620af35be        9 days ago           918MB
alpine              3.7                 6d1ef012b567        4 months ago         4.21MB

为什么docker-compose up建立新图像?理想情况下,我想使用刚构建并标记的图像prod_srdc_web

Dockerfile:

FROM alpine:3.7

RUN apk upgrade --no-cache build-base gcc python=3.7 python3-dev postgresql-dev bash git

ENV LIBRARY_PATH=lib:/usr/lib

FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN mkdir -p /code && mkdir -p /var/www/website.com/static/
WORKDIR /code

# Install dependencies
COPY requirements.txt /code/
RUN pip3 install --no-cache-dir --upgrade pip
RUN pip3 install -r requirements.txt
RUN pip3 install gunicorn

# Copy project
COPY . /code

# Copy entrypoint.prod.sh
COPY ./entrypoint.prod.sh /

EXPOSE 4500

# Run entrypoint.prod.sh
RUN [ "chmod", "+x", "./entrypoint.prod.sh" ]
ENTRYPOINT [ "./entrypoint.prod.sh" ]

docker-compose.yml

version: '3'

services:
  django_web:
    build: .
    volumes:
      - .:/srdc
    ports:
      - "4500:4500"
    container_name: srdc_c_django_web

entrypoint.prod.sh

#!/usr/bin/env bash
python manage.py makemigrations
python manage.py migrate --noinput
python manage.py collectstatic --noinput
gunicorn srdc.wsgi:application -w 3 -b 0.0.0.0:4500

看起来存储库名称srdc_django_web是通过将目录名称(srdc)与服务名称在docker-compose.yml文件(django_web)中并置而创建的。如果最终我添加了Nginx,我想使用docker-compose来运行整个容器prod_srdc_web,不要让它重新构建每个服务。

仅供参考,我的版本是:

Docker version 18.09.2, build 6247962
docker-compose version 1.23.2, build 1110ad01

1 个答案:

答案 0 :(得分:1)

您的撰写文件未指定图像名称。因此,即使您事先手动构建了映像,docker-compose也不具有您要运行的构建和已创建的映像的任何映射。要指定图像名称,请指定:

version: '3'

services:
  django_web:
    build: .
    image: prod_srdc_web:latest
    volumes:
      - .:/srdc
    ports:
      - "4500:4500"
    container_name: srdc_c_django_web

Docker将使用图像缓存来避免重新创建已经存在的相同图像层。但是,由于您具有以下条件:

COPY . /code

构建上下文中的任何文件(当前目录,假设您不忽略带有.dockerignore的文件),这些更改将导致创建新映像。其中可以包括文件所有权和权限,还包括docker-compose.yml之类的文件(如果它们位于此目录中)。