Источник condas `активирует virtualenv` не работает в Dockerfile

Сценарий

Я пытаюсь настроить простой образ докеров (я совершенно новый для докеров, поэтому, пожалуйста, исправьте мои возможные заблуждения) на основе общедоступных continuumio/anaconda3.

Dockerfile:

FROM continuumio/anaconda3:latest

# update conda and setup environment
RUN conda update conda -y \
    && conda env list \
    && conda create -n testenv pip -y \
    && source activate testenv \
    && conda env list

Построение и изображение из этого docker build -t test . заканчивается ошибкой:

/bin/sh: 1: source: not found

при активации новой виртуальной среды.

Предложение 1:

После этого ответа я попытался:

FROM continuumio/anaconda3:latest

# update conda and setup environment
RUN conda update conda -y \
    && conda env list \
    && conda create -y -n testenv pip \
    && /bin/bash -c "source activate testenv" \
    && conda env list

Кажется, что это работает сначала, так как он выводит: prepending /opt/conda/envs/testenv/bin to PATH, но conda env list, а ass echo $PATH ясно показывает, что это не так:

[...]
# conda environments:
#
testenv                  /opt/conda/envs/testenv
root                  *  /opt/conda

---> 80a77e55a11f
Removing intermediate container 33982c006f94
Step 3 : RUN echo $PATH
---> Running in a30bb3706731
/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Файлы докеров работают из коробки как MWE. Я ценю любые идеи. Спасибо!

Ответ 1

Используя инструкцию docker ENV, можно последовательно добавить путь виртуальной среды к PATH. Хотя это не решает выбранную среду, указанную в conda env list.

См. MWE:

FROM continuumio/anaconda3:latest

# update conda and setup environment
RUN conda update conda -y \
    && conda create -y -n testenv pip

ENV PATH /opt/conda/envs/testenv/bin:$PATH

RUN echo $PATH
RUN conda env list

Ответ 2

Piggybacking на ccauet answer (который я не мог заставить работать), и Чарльз Даффи отмечает, что в нем больше, чем просто PATH, вот что позаботится об этой проблеме.

При активации среды конда устанавливает следующие переменные, а также несколько резервных значений по умолчанию, на которые можно ссылаться при деактивации среды. Эти переменные были опущены из файла Docker, поскольку корневая среда conda никогда не должна использоваться снова. Для справки это CONDA_PATH_BACKUP, CONDA_PS1_BACKUP и _CONDA_SET_PROJ_LIB. Он также устанавливает PS1, чтобы показать (testenv) слева от строки подсказки терминала, которая также была опущена. Следующие инструкции будут делать то, что вы хотите.

ENV PATH /opt/conda/envs/testenv/bin:$PATH
ENV CONDA_DEFAULT_ENV testenv
ENV CONDA_PREFIX /opt/conda/envs/testenv

Чтобы уменьшить количество созданных слоев, вы можете объединить эти команды в одну команду ENV, одновременно устанавливая все переменные.

Могут быть некоторые другие переменные, которые необходимо установить на основе пакета. Например,

ENV GDAL_DATA /opt/conda/envs/testenv/share/gdal
ENV CPL_ZIP_ENCODING UTF-8
ENV PROJ_LIB /opt/conda/envs/testenv/share/proj

Простым способом получить эту информацию является вызов printenv > root_env.txt в корневой среде, активируйте testenv, затем вызовите printenv > test_env.txt и проверьте diff root_env.txt test_env.txt.