【问题标题】:Using 'pyenv activate' in a Dockerfile在 Dockerfile 中使用“pyenv activate”
【发布时间】:2019-10-29 22:54:18
【问题描述】:

我正在尝试在 Dockerfile (FROM nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04) 中安装和设置 pyenv

这是 Dockerfile 的后半部分(前半部分只是安装依赖项):

RUN useradd -ms /bin/bash user && echo "user:resu" | chpasswd && adduser user sudo
USER user
WORKDIR /home/user

# install pyenv
RUN git clone git://github.com/yyuu/pyenv.git .pyenv
ENV HOME  /home/user
ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> .bashrc
RUN echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> .bashrc
RUN echo 'eval "$(pyenv init -)"' >> .bashrc
RUN pyenv install 2.7.10

# install pyenv-virtualenv
RUN git clone https://github.com/yyuu/pyenv-virtualenv.git .pyenv/plugins/pyenv-virtualenv
RUN echo 'eval "$(pyenv virtualenv-init -)"' >> .bashrc

# setup virtualenv
RUN pyenv virtualenv 2.7.10 foo
RUN /bin/bash -c '      source .bashrc && \
                        pyenv activate foo && \
                        pip install numpy && \
                        pip install nltk'

Docker 安装在最后一行失败:

Step 20 : RUN /bin/bash -c '    source .bashrc &&                       pyenv activate foo &&                      pip install numpy &&                    pip install nltk'
 ---> Running in 672826e55a40

Failed to activate virtualenv.

Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.

这里有什么问题?是否有使用 Docker 设置 pyenvs 的最佳实践?

【问题讨论】:

  • 不完全是一个解决方案,但我在这种情况下使用“真正的”可执行路径。不要依赖pyenv activate,只需将pip替换为$PYENV_ROOT/versions/foo/bin/pip即可。
  • 就我个人而言,我认为容器中不需要虚拟环境,但其他人可能不同意
  • 可能想要在特定 dockerfile 上安装任何特定版本的 python 的人会不同意
  • @Kalessar 你有没有解决/解决这个问题?
  • 我很尴尬地承认这一点,但我遇到了同样的问题,在我的情况下,这是因为我从两个不同的堆栈溢出指令复制粘贴,设置 PYENV_ROOT 和路径变量到某个路径 (/opt/pyenv/) 和 .bashrc 的东西到另一个 (~/.pyenv)。

标签: python ubuntu docker virtualenv pyenv


【解决方案1】:

您的 source .bashrc 很可能被忽略(因此默认的 pyenv 设置不会继续),因为 bashrc 通常配置为 abort if not in the interactive mode

作为一种解决方法,添加-i 交互式开关,或使用链接讨论中的另一个技巧。对于这个例子,这将是:

bash -i -c "source ~/.bashrc && pyenv activate foo"

或者,您可以在激活步骤之前运行设置 pyenv 的相关命令(您可以在 .bashrc 中找到它们)。对我来说,这将是:

bash -c "\
export PATH="/home/krassowski/.pyenv/bin:$PATH" &&\
eval "$(pyenv init -)" && \
eval "$(pyenv virtualenv-init -)" && \
pyenv activate foo"

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多