docker - Dockerfile中的复制

标签 docker dockerfile

我有一个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/

    相关文章:

    docker - 在 Docker Swarm 的 docker-compose.yml 卷中挂载 OpenMediaVault NFS

    java - 从 docker 容器内部连接到 Cassandra

    docker - Dockerfile 中的错误变量名

    docker - .dockerignore在子目录上不起作用…仍然在镜像中结束

    docker - 将两个Docker镜像组合为一个:NodeJS和MongoDB

    Docker ping 其他节点上的容器

    mysql - Processlist中有这么多Binlog_dump连接?

    docker - 使用docker运行Redis master和哨兵的问题

    docker - 为什么我的docker build命令失败并出现 “invalid id”错误?

    mysql - 在 Dockerfile 中创建动态用户 - MySQL