在Dockerfile中使用'pyenv activate'

8

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

这是 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即可。 - uranusjr
3
个人而言,我不认为容器内需要virtualenvs,但其他人可能持不同意见。 - OneCricketeer
1
可能想在特定的Dockerfile上安装特定版本的Python的人会有不同意见。 - lurscher
@Kalessar 你有解决/绕过这个问题吗? - thclark
我感到有些尴尬承认这一点,但我的情况与你类似。我从两个不同的Stack Overflow指南中复制粘贴了代码,将PYENV_ROOT和路径变量设置为某个路径(/opt/pyenv/),而.bashrc文件则设置到另一个路径(~/.pyenv)。 - matentzn
1个回答

1
很可能你的source .bashrc被忽略了(因此默认的pyenv设置没有进行),因为bashrc通常配置为如果不在交互模式下则中止
作为解决方法,添加-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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接