python - 在 Dockerfile 中设置别名不起作用:找不到命令
问题描述
我的 Dockerfile 中有以下内容:
...
USER $user
# Set default python version to 3
RUN alias python=python3
RUN alias pip=pip3
WORKDIR /app
# Install local dependencies
RUN pip install --requirement requirements.txt --user
构建图像时,我得到以下信息:
Step 13/22 : RUN alias pip=pip3
---> Running in dc48c9c84c88
Removing intermediate container dc48c9c84c88
---> 6c7757ea2724
Step 14/22 : RUN pip install --requirement requirements.txt --user
---> Running in b829d6875998
/bin/sh: pip: command not found
pip
如果我在其顶部设置别名,为什么无法识别?
Ps:我不想.bashrc
用于加载别名。
解决方案
问题是别名只存在于图像中的那个中间层。尝试以下操作:
FROM ubuntu
RUN apt-get update && apt-get install python3-pip -y
RUN alias python=python3
在这里测试:
❰mm92400❙~/sample❱✔≻ docker build . -t testimage
...
Successfully tagged testimage:latest
❰mm92400❙~/sample❱✔≻ docker run -it testimage bash
root@78e4f3400ef4:/# python
bash: python: command not found
root@78e4f3400ef4:/#
这是因为每层都会启动一个新的 bash 会话,所以别名会在后面的层中丢失。
为了保持稳定的别名,您可以像 python 在其官方图像中那样使用符号链接:
FROM ubuntu
RUN apt-get update && apt-get install python3-pip -y
# as a quick note, for a proper install of python, you would
# use a python base image or follow a more official install of python,
# changing this to RUN cd /usr/local/bin
# this just replicates your issue quickly
RUN cd "$(dirname $(which python3))" \
&& ln -s idle3 idle \
&& ln -s pydoc3 pydoc \
&& ln -s python3 python \ # this will properly alias your python
&& ln -s python3-config python-config
RUN python -m pip install -r requirements.txt
注意使用python3-pip
包来捆绑 pip。调用pip
时,最好使用python -m pip
语法,因为它可以确保您调用的 pip 与您的 python 安装相关:
python -m pip install -r requirements.txt
推荐阅读
- apache - XMLHttpRequest 被 axios.post 上的 CORS 策略阻止
- python - 修复python中的重叠图形
- vue.js - 当属性不是 src 时如何让 Vue CLI 生成的项目替换图像 src
- pandas - 根据标签划分两行值并创建一个新列以填充计算值
- c# - 具有类名的变量
- vb.net - 如何在没有 lambda 的情况下做到这一点?
- python - Pygame 窗口在使用线程时冻结
- opencv - 如何使用 PythonPath 指向新安装的 Opencv?
- mysql - RHEL 7 中的 pdo mysql 驱动程序不起作用
- ruby-on-rails - StoreModel gem 似乎不支持数组