Как создать докер-контейнер с Python 2 и 3, доступный в Jupyter Notebooks? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь создать докер-контейнер, который имеет anaconda и поддерживает записные книжки Jupyter с python 2 и 3. Я создал контейнер на основе официального контейнера 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, я вижу варианты 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 до того, как команды не изменят сообщение об ошибке.

Кроме того, основываясь на этом ТАК вопрос Я пытался:

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:

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

1 Ответ

0 голосов
/ 18 октября 2019

Из этого выпуска вам необходимо отделить директиву SHELL в Dockerfile, например SHELL ["/bin/bash", "-c"]. Проблема может заключаться в том, что оболочкой по умолчанию в команде RUN является 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...