我有一个Django Web应用程序,在后台将 celery 用于定期任务。
现在我有三个docker镜像
其
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/