【问题标题】:How do I create a docker container with both Python 2 and 3 available in Jupyter Notebooks?如何在 Jupyter Notebooks 中使用 Python 2 和 3 创建一个 docker 容器?
【发布时间】:2019-10-18 01:37:11
【问题描述】:

我正在尝试创建一个具有 anaconda 并支持带有 python 2 和 3 的 Jupyter 笔记本的 docker 容器。我创建了一个基于官方 anaconda python 3 容器的容器,如下所示:

FROM continuumio/anaconda3:latest

WORKDIR /app/
COPY requirements.txt /app/

RUN pip install --upgrade pip && \
    pip install -r requirements.txt

一旦在容器上,我可以通过输入以下命令让 python 2 和 3 与 Jupyter 笔记本一起工作:

conda create -y -n py2 python=2.7
conda activate py2
conda install -y notebook ipykernel
ipython kernel install --user
conda deactivate

然后当我回到基地并运行jupyter kernelspec list 时,我看到了:

(base) root@1683850aacf0:/app# jupyter kernelspec list
Available kernels:
  python2    /root/.local/share/jupyter/kernels/python2
  python3    /root/.local/share/jupyter/kernels/python3

当我打开一个 jupyter notebook 服务器时,我看到了 python 2 和 3 选项。这就是我想要达到的状态。我试图将所有这些都变成 docker 命令,如下所示:

RUN    conda create -y -n py2 python=2.7
RUN    conda activate py2
RUN    conda install -y notebook ipykernel
RUN    ipython kernel install --user
RUN    conda deactivate

但运行命令来激活或停用 (RUN conda activate py2) conda 环境会给我一个错误:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

在命令前添加RUN conda init bash 不会更改错误消息。

另外,基于这个SO question我试过了:

RUN conda create -y -n py3 python=3.7 ipykernel
RUN conda create -y -n py2 python=2.7 ipykernel

但是在我构建并进入容器之后,我只看到了 python 3 环境:

(base) root@b301d8ab5f1e:/app# jupyter kernelspec list
Available kernels:
  python3    /opt/conda/share/jupyter/kernels/python3

我可以激活 py2 并查看该内核,但不能同时查看:

(py2) root@b301d8ab5f1e:/app# jupyter kernelspec list
Available kernels:
  python2    /opt/conda/envs/py2/share/jupyter/kernels/python2

我还应该尝试什么?

编辑:

我尝试按照 Adiii 的建议指定 shell:

FROM continuumio/anaconda3:latest

WORKDIR /app/
COPY requirements.txt /app/

RUN pip install --upgrade pip && \
    pip install -r requirements.txt

ENV BASH_ENV ~/.bashrc
SHELL ["/bin/bash", "-c"]
RUN    conda create -y -n py2 python=2.7
RUN    conda activate py2
RUN    conda install -y notebook ipykernel
RUN    ipython kernel install --user
RUN    conda deactivate

这允许构建容器,但由于某种原因没有 python 2.7 环境:

(base) root@31169f698f14:/app# jupyter kernelspec list
Available kernels:
  python3    /root/.local/share/jupyter/kernels/python3
(base) root@31169f698f14:/app# conda info --envs
# conda environments:
#
base                  *  /opt/conda
py2                      /opt/conda/envs/py2

(base) root@31169f698f14:/app# conda activate py2
(py2) root@31169f698f14:/app# jupyter kernelspec list
Available kernels:
  python3    /root/.local/share/jupyter/kernels/python3

【问题讨论】:

标签: python docker jupyter-notebook anaconda


【解决方案1】:

从这个issue,您需要在Dockerfile 中指定SHELL 指令,例如SHELL ["/bin/bash", "-c"]。问题可能是 RUN 命令中的默认 shell 是sh

这类似于上面的解决方案,但避免了一些 每个 RUN 命令中的样板:

ENV BASH_ENV ~/.bashrc
SHELL ["/bin/bash", "-c"]

那么这样的事情应该可以按预期工作:

RUN conda activate my-env && conda info --envs

或者,永久设置环境(包括交互式 壳)你可以:

RUN echo "conda activate my-env" >> ~/.bashrc

Dockerfile

FROM continuumio/anaconda3:latest

WORKDIR /app/

RUN pip install --upgrade pip
ENV BASH_ENV ~/.bashrc
SHELL ["/bin/bash", "-c"]
RUN    conda create -y -n py2 python=2.7
RUN    conda activate py2
RUN    conda install -y notebook ipykernel
RUN    ipython kernel install --user
RUN    conda deactivate

【讨论】:

  • 我试过这个并且它构建但没有提供 python 2。我将在我的问题中发布输出
  • @jss367 解决此问题的答案 "CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'Currently supported shells are:" 如果还有其他问题,您可以提出另一个问题,而不是更新每个问题时间问题:)
【解决方案2】:

这就是最终的工作:

RUN conda env create -f py2_env.yaml
RUN conda env create -f py3_env.yaml
RUN /bin/bash -c "conda init bash && source /root/.bashrc && conda activate py2 && conda install -y notebook ipykernel && ipython kernel install --user && conda deactivate"
RUN /bin/bash -c "conda init bash && source /root/.bashrc && conda activate py3 && conda install -y notebook ipykernel && ipython kernel install --user && conda deactivate"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2020-05-16
    • 2021-04-24
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多