我有一个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
字符串
1条答案
按热度按时间rn0zuynd1#
对于这个设置,我会使用Python虚拟环境。这在Docker中有时会有点棘手-
activate
脚本不会持久化,虚拟环境与非常特定的Python安装绑定-但它很容易做到。这里的一个关键是两个stage需要有 * 完全 * 相同的镜像。这是使用构建时
ARG
来控制它的好地方;即使你永远不会在外部更改它,它也会确保两个stage匹配。字符串
在第一阶段,在已知路径上创建一个虚拟环境,使用该虚拟环境的
pip
和其他工具进行安装。型
在第二个阶段中,复制虚拟环境。您在第一个阶段中选择了它的名称,因此它不依赖于版本。虚拟环境在两个阶段中必须位于相同的路径。设置
$PATH
以使虚拟环境优先将有所帮助(这是activate
脚本所做的事情之一)。但是从那里开始,Dockerfile的其余部分看起来和你现在拥有的一样。型