web-dev-qa-db-ja.com

condas `source activate virtualenv`がDockerfile内で機能しない

シナリオ

私は単純なドッカーイメージをセットアップしようとしています(私はドッカーに非常に新しいので、一般に基づいて考えられる誤解)を修正してください- continuumio/anaconda コンテナー。

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および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

DockerファイルはそのままMWEとして機能します。どんなアイデアにも感謝します。ありがとう!

20
ccauet

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
6
ccauet

Ccauetの答え(私はそれを実現することができませんでした)をピギーバックし、Charles DuffeyはPATH以外にもそれがあることについてのコメントがあります。ここで問題を処理します。

環境をアクティブ化すると、condaは次の変数と、環境を非アクティブ化するときに参照できるいくつかのバックアップデフォルト値を設定します。ルートコンダ環境を再び使用する必要がないため、これらの変数はDockerfileから省略されています。参考までに、これらはCONDA_PATH_BACKUPCONDA_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

作成されるレイヤーの数を減らすために、これらのコマンドを1つの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を調べることです。

0
GnomeChompsky