gpt4 book ai didi

python - 为什么 docker-compose 在 `docker-compose up` 上构建一个新镜像?

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:18 24 4
gpt4 key购买 nike

当我运行 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

入口点.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 up 来运行整个容器 prod_srdc_web,而不是让它重新构建每个服务。

仅供引用,我的版本是:

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

最佳答案

您的撰写文件未指定图像名称。因此,即使您提前手动构建了镜像,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 之类的文件(如果它们在此目录中)。

关于python - 为什么 docker-compose 在 `docker-compose up` 上构建一个新镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57154868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com