【发布时间】:2018-03-17 22:44:15
【问题描述】:
我有一个 Django Web 应用程序,它在后台使用 celery 执行周期性任务。
现在我有三个 docker 图像
- 一个用于 django 应用程序
- 芹菜工人专用
- 一个用于 celery 调度程序
他们的Dockerfiles 都长这样:
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 处理单个图像并为每个服务覆盖 CMD 的好地方
-
至于
apk update何时被缓存,docker不知道。您的apk update和安装只有在您更改正在安装的软件包集(这会使该行的缓存无效)或您编辑您的Pipfile或Pipfile.lock(这会使上面缓存的COPY命令无效并且所有后续步骤) -
@avigil 合理的建议,但我也想将我的应用程序部署到heroku。而且它不使用 docker-compose afaik。
标签: docker dockerfile