gpt4 book ai didi

docker - Dockerfile中的复制

转载 作者:行者123 更新时间:2023-12-02 21:17:57 25 4
gpt4 key购买 nike

我有一个Django Web应用程序,在后台将 celery 用于定期任务。

现在我有三个docker镜像

  • 用于Django应用程序
  • 一位 celery worker
  • 用于 celery 调度程序

  • Dockerfile都像这样:
    FROM alpine:3.7

    ENV PYTHONUNBUFFERED 1

    RUN mkdir /code
    WORKDIR /code
    COPY Pipfile Pipfile.lock ./

    RUN apk update && \
    apk add python3 postgresql-libs jpeg-dev git && \
    apk add --virtual .build-deps gcc python3-dev musl-dev postgresql-dev zlib-dev && \
    pip3 install --no-cache-dir pipenv && \
    pipenv install --system && \
    apk --purge del .build-deps

    COPY . ./

    # Run the image as a non-root user
    RUN adduser -D noroot
    USER noroot

    EXPOSE $PORT

    CMD <Different CMD for all three containers>

    因此,除了最后一行,它们都完全相同。

    在这里创建包含CMD以外的所有内容的基本镜像是否有意义?并且所有三个图像都以此为基础并仅添加各自的CMD?

    还是那不会给我带来任何好处,因为无论如何都会缓存所有内容?

    像上面看到的分隔符合理吗?

    两个小奖励问题:
  • 有时apk update ..层由docker缓存。 docker 如何知道这里没有更新?
  • 我经常读到我应该尽可能减少图层以减小图像大小。但这不符合缓存的想法,会导致构建时间更长吗?
  • 最佳答案

    我建议查看docker-compose以简化多个容器的管理。

    使用与上面发布的文件相同的单个Dockerfile,然后创建一个docker-compose.yml,看起来像这样:

    version: '3'
    services:
    # a django service serving an application on port 80
    django:
    build: .
    command: python manage.py runserver
    ports:
    - 8000:80
    # the celery worker
    worker:
    build: .
    command: celery worker
    # the celery scheduler
    scheduler:
    build: .
    command: celery beat

    当然,将此处的命令修改为您当前用于单独的Dockerfile的命令。

    当您要重建镜像时, docker-compose build将为第一个服务从Dockerfile重建您的容器镜像,然后将构建的镜像重用于其他服务(因为它们已经存在于缓存中)。 docker-compose up将启动容器镜像的3个实例,但每次都会覆盖run命令。

    如果您想变得更复杂,可以使用 plenty of resources来实现django和celery的非常常见的组合。

    关于docker - Dockerfile中的复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49342652/

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