Как активировать и переключать среду анаконды в Dockerfile во время сборки - PullRequest
2 голосов
/ 09 июня 2019

Я пытался часами и не могу понять, как активировать и переключать среды anaconda в Dockerfile во время процесса сборки

Вот начальный код:

FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04

# Set user
ENV SETUSER myuser

RUN useradd -m $SETUSER
USER $SETUSER
WORKDIR /home/$SETUSER

# Install Anaconda
RUN wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh
RUN bash Anaconda3-2019.03-Linux-x86_64.sh -b
RUN rm Anaconda3-2019.03-Linux-x86_64.sh

# Set path to conda
ENV CONDA_ENV_NAME mynewenv
RUN /home/$SETUSER/anaconda3/condabin/conda create -q --name $CONDA_ENV_NAME python=3.6 && \
    /home/$SETUSER/anaconda3/condabin/conda clean --yes --all
RUN /home/$SETUSER/anaconda3/condabin/conda activate base #Just for testing anaconda environment

Сначала anaconda в Docker будет жаловаться, что оболочка не настроена должным образом, поэтому после добавления команды conda create я добавил:

RUN /home/$SETUSER/anaconda3/condabin/conda init bash
RUN /bin/bash -c "source /home/$SETUSER/.bashrc"
RUN /home/$SETUSER/anaconda3/condabin/conda activate base

Выполнение 3 команд после построения образа докера работает (т.е. выполняется интерактивно после вызова docker run container-name), но по какой-то причине оно не работает, когда строит контейнер. Я выяснил, что переменная $ PATH не обновлялась во время сборки, поэтому сравнил мой $ PATH при сборке и после сборки.

ENV PATH /home/$SETUSER/anaconda3/envs/$CONDA_ENV_NAME/bin:$PATH
ENV PATH /home/$SETUSER/anaconda3/condabin:$PATH
ENV PATH /home/$SETUSER/anaconda3/bin:$PATH
RUN conda init bash
RUN /bin/bash -c "source /home/$SETUSER/.bashrc"
RUN conda activate base

Теперь Docker $ PATH при сборке и $ PATH при интерактивном изменении при запуске контейнера после сборки одинаковы, но я все еще получаю ошибку установки оболочки неправильно.

CommandNotFoundError: Ваша оболочка не была правильно сконфигурирована для использования «активации conda». Чтобы инициализировать вашу оболочку, запустите $ conda init В настоящее время поддерживаются следующие оболочки: - Баш - рыба - тсш - xonsh - зш - PowerShell Смотрите 'conda init --help' для получения дополнительной информации и опций. ВАЖНО: Вам может потребоваться закрыть и перезапустить вашу оболочку после запуска 'conda init'.

Почему это не работает ???

Я видел, что может быть обходной путь с использованием шаблона док-станции miniconda, но я не могу использовать это. Как создать и переключить среду anaconda в процессе сборки Docker? Спасибо!

1 Ответ

2 голосов
/ 09 июня 2019

У вас слишком много команд RUN в вашем Dockerfile. Дело не только в том, что каждый RUN создает новый слой на изображении. Кроме того, каждая команда RUN запускает новую оболочку, и conda activate применяется только к текущей оболочке.

Вы должны объединить логические группы действий в одну команду RUN. Используйте && для объединения команд и \ для разбивки строк для удобства чтения:

RUN conda activate <myenv> \
 && conda install <whatever> \
 && ...

Имейте в виду: в конце этой команды RUN оболочка исчезнет. Поэтому, если вы хотите потом что-то сделать для этой среды conda, вам придется снова запустить conda activate или использовать -n <myenv>, чтобы поместить что-то в среду, не активируя ее сначала.

Когда вы запускаете контейнер с изображения, вам также нужно будет вызвать conda activate внутри контейнера.

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