我的生产Django应用程序有一个非常简约的Dockerfile
:
FROM python:3.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apt-get update &&
apt-get -y upgrade
WORKDIR /app
COPY requirements.txt ./
RUN pip install --upgrade pip && \
pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD [ "gunicorn", "api.wsgi:application", "--bind=0.0.0.0" ]
我需要运行apt-get update && apt-get -y upgrade
吗?据我了解,这两个命令(1)下载可用软件包的最新列表,以及(2)升级已安装的软件包。为什么官方的python docker镜像还没有这样做?
如果我不需要在这个简约的Dockerfile中运行它们,什么时候需要运行它们?我注意到它们通常在installing other packages时运行。
答案 0 :(得分:1)
像ubuntu:18.04
这样的基本Docker Hub Linux分发映像实际上会定期定期更新:如果您docker pull ubuntu:18.04
,请等待一周,然后重复一次,您将获得更新的映像。您在某种程度上依赖中间图像(例如python:3.8
)来完成相同的工作。
在Dockerfile中运行apt-get update
和类似的“升级一切”命令是不寻常的,但并非闻所未闻;更常见的是要么假设基础映像已经是最新的,要么具有特定的出处要求,然后在基础分发映像的基础上从头开始构建所有内容。
如果您使用的是主要版本或次要版本的图像标签(python:3
,python:3.8
,python:3.8-buster
),就可以了,只要您确保定期将您的基本图片更新为Docker Hub image page上列出的内容。如果您要强制使用特定的补丁程序级别(python:3.8.4
),则存在一定风险,因为一旦发布了较新的上游版本,这些映像就会停止获取更新。
如果需要安装任何操作系统级别的软件包,则需要运行apt-get update
,并且出于Docker层缓存的原因,您应使用与相应{{1 }}
RUN
答案 1 :(得分:0)
查看docker best pratices,您应该进行更新而不是升级,因为这需要您的容器以特权权限运行。进行更新时,请确保您正在安装要安装的软件包的最新版本。考虑到这一点,基础映像的提供者负责选择基础中使用的软件包的版本(或更新为最新版本),而您负责所需的软件包。