我正在try 在一个停靠的minconda环境中运行一个python脚本.我面临的问题是,当我docker run交互(-it)并在内部手动运行脚本时,它工作得很好.但是当以非交互方式I docker run时,找不到与minconda安装一起提供的模块,如cryptographylxml.

我的docker文件:

ARG REGISTRY=harbor-west.reg.com/ci
ARG FROM_TAG=master

FROM harbor-west.reg.com/base-os/ubuntu:20.04
USER root

ENV CONDA_DIR $HOME/miniconda3

RUN apt update && \
    DEBIAN_FRONTEND=noninteractive apt install -y \
        python3 \
        python3-pip \
        wget
RUN pip install --upgrade \
                    google-api-python-client \
                    grpcio \
                    matplotlib \
                    numpy \
                    opencv-python \
                    pandas \
                    scikit-learn

RUN mkdir /abc
#Download a conda package under /abc/bin - steps removed for simplicity

#install miniconda
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-x86_64.sh
RUN chmod 755 Miniconda3-py38_23.3.1-0-Linux-x86_64.sh
RUN /bin/bash -c "./Miniconda3-py38_23.3.1-0-Linux-x86_64.sh -b"
ENV PATH=$CONDA_DIR/bin:$PATH
RUN /root/miniconda3/condabin/conda init

WORKDIR /abc/bin

CMD ["/bin/bash", "-c", "/abc/bin/start-prediction.sh"]
#ENTRYPOINT ["/abc/bin/start-prediction.sh"]

非交互式停靠运行的输出(意外):

Traceback (most recent call last):
  File "prediction_server.py", line 2, in <module>
    from abc.learn import prepare_data, SuperResolution
  File "/abc/bin/abc/__init__.py", line 3, in <module>
    from abc.auth.tools import LazyLoader
  File "/abc/bin/abc/auth/__init__.py", line 1, in <module>
    from .api import RegSession
  File "/abc/bin/abc/auth/api.py", line 30, in <module>
    from ._auth import (
  File "/abc/bin/abc/auth/_auth/__init__.py", line 2, in <module>
    from ._pki import PKIAuth
  File "/abc/bin/abc/auth/_auth/_pki.py", line 4, in <module>
    from ..tools._lazy import LazyLoader
  File "/abc/bin/abc/auth/tools/__init__.py", line 1, in <module>
    from .certificate import pfx_to_pem
  File "/abc/bin/abc/auth/tools/certificate.py", line 6, in <module>
    import cryptography
ModuleNotFoundError: No module named 'cryptography'

交互式坞站运行的输出(如预期):

(base)root@dcc788e0a8c5:/abc/bin# ./start-prediction.sh 
server listening on  0.0.0.0:50443

我试着 echo 容器内部的路径,看起来没问题:

/root/miniconda3/bin:/root/miniconda3/condabin:/miniconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

我不知道我错过了什么.我认为,如果它以交互方式工作,那么它也应该以非交互方式工作.如有任何建议,我们将不胜感激.

推荐答案

我也为同样的问题而苦苦挣扎.

关键是当您执行conda init时,它会在您的shell rc中添加一些行,在本例中是.bashrc行.source.

因此,解决方案很简单:找出你的.bashrc英镑.

不过,您有另一个不涉及编辑RC文件的解决方案.你可以把你的SHELL换成你的CONTA环境.当您取消这个shell 时,安装包需求并运行您的代码.

SHELL ["conda", "run", "-n", "base", "/bin/bash", "-c"]

Python相关问答推荐

理解Python的二分库:澄清bisect_left的使用

如何在msgraph.GraphServiceClient上进行身份验证?

如果值不存在,列表理解返回列表

图像 pyramid .难以创建所需的合成图像

如何在Python中并行化以下搜索?

Python键入协议默认值

当独立的网络调用不应该互相阻塞时,'

如何在Python中找到线性依赖mod 2

如何合并两个列表,并获得每个索引值最高的列表名称?

合并帧,但不按合并键排序

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

剪切间隔以添加特定日期

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

如果包含特定值,则筛选Groupby

处理Gekko的非最优解

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

PYTHON中的pd.wide_to_long比较慢

对当前的鼹鼠进行编码,并且我的按键获得了注册

在使用ROLING()获得最大值时,是否可以排除每个窗口中的前n个值?