0

Dockerfile 包含:

RUN /bin/bash -c "python3 -m pip install --upgrade pip && python3 -m pip install conan"

一旦构建,它就再也不会运行它,而是使用缓存。只要版本(pip's + conan's)没有改变,我就很好。

处理这种情况的最佳做法是什么?docker/buildah如果有新版本,我想检测是否需要更改图层。故意地,我没有添加任何版本来始终获得最新版本。

我很难找到我遇到的错误的原因,柯南在新版本中更改了他们的 SSL 证书,而我被以前的版本卡住了,阻止我安装包。

4

1 回答 1

0

这种冲突正是使用列出要使用的特定版本的包的版本锁定文件的原因。即使您认为您通常需要最新版本,这也为您(或打包工具)提供了一个地方来记录您知道有效的一组特定版本。

例如,使用 Python 的基本setuptools系统,您可以在setup.cfg文件中声明您的应用程序需要该特定包

[options]
install_requires=
    conan

现在在您的本地(非 Docker)开发环境中,您可以安装它

rm -rf venv           # clean up the old virtual environment
python3 -m venv venv  # create a new virtual environment
. venv/bin/activate   # activate it
pip install -e .      # install current directory and its dependencies

或者,如果您已经设置了虚拟环境

pip install --upgrade -e .

现在您可以要求pip转储需求文件

pip freeze > requirements.txt

在你的 Dockerfile 中,COPYrequirements.txt文件中,并使用它来安装包。

FROM python:3.9
# Upgrade pip, since it likes to complain about being out of date
RUN pip install --upgrade pip
# Install package dependencies
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
# Install the rest of the application
COPY . .
CMD ["./application.py"]

Docker 的层缓存系统意味着,如果requirements.txt文件已更改,Docker 将重新运行pip install,如果没有,它将跳过它(直到下一COPY行文件更改)。同时,您可以控制要使用的确切版本(您可以放入版本约束setup.cfg或手动编辑requirements.txt以避免损坏的版本),因此上游更改的中断并不意味着您不能发布代码。最后,您在开发环境和 Docker 中使用相同的打包系统,因此很容易保持一致(我通常不鼓励pip install在 Dockerfile 中使用单个包)。

于 2021-11-26T12:16:27.643 回答