Docker文件中的包副本失败

oknwwptz  于 2024-01-06  发布在  Docker
关注(0)|答案(1)|浏览(176)

我有一个dockerfile,它有这一行,我试图从这一行删除这个硬编码的值。
这是原始的一行,当我做docker构建时,它可以工作COPY --from=stage1 /usr/local/lib/python3.10/site-packages/ /usr/local/lib/python3.10/site-packages/
而当我尝试用这行替换时,构建失败
ARG PYTHON_VERSION=3.10
COPY --from=stage1 /usr/local/lib/python${PYTHON_VERSION}/site-packages/ /usr/local/lib/python${PYTHON_VERSION}/site-packages/
这里的错误是COPY failed: stat usr/local/lib/python3.10.13/site-packages/: file does not exist
当我检查stage1 docker镜像时,python文件存在于/usr/local/lib/python3.10/site-packages/
这是我的整个docker文件

FROM base-image:tag as stage1

COPY requirements.txt requirements.txt
ARG PYTHON_VERSION=3.10

RUN  gcc \
    && pip install -r requirements.txt \
    && rm -f requirements.txt 

RUN mkdir -p /usr/local/lib/python3.10/site-packages/
FROM baseimage:tag as stage2
COPY --from=stage1  /usr/local/lib/python3.10/site-packages/  /usr/local/lib/python3.10/site-packages/
COPY . /my_dir
WORKDIR /my_dir

RUN chmod +x my_script.sh

字符串

rn0zuynd

rn0zuynd1#

对于这个设置,我会使用Python虚拟环境。这在Docker中有时会有点棘手-activate脚本不会持久化,虚拟环境与非常特定的Python安装绑定-但它很容易做到。
这里的一个关键是两个stage需要有 * 完全 * 相同的镜像。这是使用构建时ARG来控制它的好地方;即使你永远不会在外部更改它,它也会确保两个stage匹配。

# before any FROM lines
ARG BASE_IMAGE=python:3.10 # or your base-image:tag

字符串
在第一阶段,在已知路径上创建一个虚拟环境,使用该虚拟环境的pip和其他工具进行安装。

FROM ${BASE_IMAGE} AS stage1

# Create the virtual environment
RUN python3 -m venv /venv

# Stay out of the filesystem root directory
WORKDIR /app

# Do you need OS-level dependencies?
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --assume-yes --no-install-recommends \
      build-essential

# Install package dependencies
COPY requirements.txt .

# Make sure to use the virtual environment's pip
RUN /venv/bin/pip install -r requirements.txt


在第二个阶段中,复制虚拟环境。您在第一个阶段中选择了它的名称,因此它不依赖于版本。虚拟环境在两个阶段中必须位于相同的路径。设置$PATH以使虚拟环境优先将有所帮助(这是activate脚本所做的事情之一)。但是从那里开始,Dockerfile的其余部分看起来和你现在拥有的一样。

FROM ${BASE_IMAGE}
COPY --from=stage1 /venv /venv
ENV PATH=/venv/bin:$PATH
WORKDIR /my_dir
COPY ./ ./
CMD ["./my_script.sh"]

相关问题