Python 3.x 部署容器时,已安装的pip包不可用

Python 3.x 部署容器时,已安装的pip包不可用,python-3.x,docker,kubernetes,pip,openshift,Python 3.x,Docker,Kubernetes,Pip,Openshift,在我的Dockerfile中,我有: FROM python:3.7 RUN apt update RUN apt install -y git RUN groupadd -g 1001 myuser RUN useradd -u 1001 -g 1001 -ms /bin/bash myuser USER 1001:1001 USER myuser WORKDIR /home/myuser COPY --chown=myuser:myuser requirements.txt ./ EN

在我的Dockerfile中,我有:

FROM python:3.7
RUN apt update
RUN apt install -y git

RUN groupadd -g 1001 myuser
RUN useradd -u 1001 -g 1001 -ms /bin/bash myuser
USER 1001:1001
USER myuser
WORKDIR /home/myuser

COPY --chown=myuser:myuser requirements.txt ./

ENV PYTHONPATH="/home/myuser/.local/lib/python3.7/site-packages:.:$PYTHONPATH"
RUN python3.7 -m pip install -r requirements.txt
COPY --chown=myuser:myuser  . .

ENV PATH="/home/myuser/.local/bin/:$PATH"

ENV HOME=/home/myuser
ENV PYTHONHASHSEED=1
EXPOSE 8001
CMD [ "python3.7", "app.py" ]
在生成过程中,
pip list
正确显示所有库:

basicauth       0.4.1
pip             21.1.1
python-dateutil 2.8.1
pytz            2019.1
PyYAML          5.1.1
requests        2.22.0
setuptools      56.0.0
six             1.16.0
urllib3         1.25.11
wheel           0.36.2
但一旦OpenShift部署了容器,我只安装了以下库:

WARNING: The directory '/home/myuser/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
Package    Version
---------- -------
pip        21.1.1
setuptools 56.0.0
wheel      0.36.2
CMD命令按预期运行,但没有安装任何软件包

Traceback (most recent call last :
File "app.py", line 16, in ‹module>
import requests
ModuleNotFoundError: No module named 'requests'

修订的Dockerfile更符合标准实践:

FROM python:3.7

RUN apt update && \ 
    apt install -y --no-install-recommends git && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY requirements.txt .
RUN python3.7 -m pip install -r requirements.txt
COPY . .

ENV PYTHONHASHSEED=1
USER nobody
CMD [ "python3.7", "app.py" ]
我将最初的
运行
层组合成一个较小的图像,并在退出该层之前清理apt列表。包以root用户的身份全局安装,然后才更改为运行时用户。在本例中,除非您特别需要homedir,否则我将坚持使用
nobody
/65534作为表示“低优先级运行时用户”的标准方式


请记住,OpenShift会覆盖容器级别
用户
信息

更符合标准实践的修订Dockerfile:

FROM python:3.7

RUN apt update && \ 
    apt install -y --no-install-recommends git && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY requirements.txt .
RUN python3.7 -m pip install -r requirements.txt
COPY . .

ENV PYTHONHASHSEED=1
USER nobody
CMD [ "python3.7", "app.py" ]
我将最初的
运行
层组合成一个较小的图像,并在退出该层之前清理apt列表。包以root用户的身份全局安装,然后才更改为运行时用户。在本例中,除非您特别需要homedir,否则我将坚持使用
nobody
/65534作为表示“低优先级运行时用户”的标准方式


请记住,OpenShift会覆盖容器级别
USER
info

请将完整的Dockerfile发布到某个地方。最有可能的是,这与运行在其中的shell相关,
RUN
命令使用shell上下文,而数组
CMD
直接执行,没有shell进程。另外,你不需要做任何这些,只需像普通的根一样全局安装,它是一个容器,而不是虚拟机或工作站。你好@coderanger,谢谢。我已经用整个Dockerfile和更多信息更新了这个问题。奇怪的是,只有在OpenShift上运行时才会发生这种情况,如果我在本地构建一切都按预期工作,并且安装了库。您作为运行时用户安装软件包有什么具体原因吗?这实际上比正常安装要不安全。你是什么意思?我应该在pip安装后移动用户myuser吗@代码范围奇怪的是,当我在本地构建时,问题就不会发生。只有在我运行OpenShift/KubernetesPlease时才会发生这种情况,请将完整的Dockerfile发布到某个地方。最有可能的是,这与运行在其中的shell相关,
RUN
命令使用shell上下文,而数组
CMD
直接执行,没有shell进程。另外,你不需要做任何这些,只需像普通的根一样全局安装,它是一个容器,而不是虚拟机或工作站。你好@coderanger,谢谢。我已经用整个Dockerfile和更多信息更新了这个问题。奇怪的是,只有在OpenShift上运行时才会发生这种情况,如果我在本地构建一切都按预期工作,并且安装了库。您作为运行时用户安装软件包有什么具体原因吗?这实际上比正常安装要不安全。你是什么意思?我应该在pip安装后移动用户myuser吗@代码范围奇怪的是,当我在本地构建时,问题就不会发生。只有当我在OpenShift/Kubernetest上运行时才会发生这种情况,而现在我在docker中没有写访问权限。我被拒绝了。我怎样才能解决这个问题?谢谢您确实不应该将文件存储在/tmp之外的映像中,您应该仍然可以访问该映像。如果需要存储,请使用一个卷,可以是emptyDir卷,也可以是普通的永久卷。这样可以工作,但现在我在docker中没有写访问权限。我被拒绝了。我怎样才能解决这个问题?谢谢您确实不应该将文件存储在/tmp之外的映像中,您应该仍然可以访问该映像。如果需要存储,请使用一个卷,可以是emptyDir或普通持久卷。