web-dev-qa-db-ja.com

ビルド中にDockerfileでAnaconda環境をアクティブ化して切り替える

私は何時間も試してきましたが、ビルドプロセス中にDockerfileでanaconda環境をアクティブ化して切り替える方法を理解できません

これが初期コードです:

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

最初に、Dockerのanacondaはシェルが正しくセットアップされていないと文句を言うので、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

Dockerイメージのビルド後に3つのコマンドを実行すると機能します(つまり、docker run container-nameを呼び出した後にインタラクティブに実行します)が、何らかの理由でbuildingコンテナーの場合は機能しません。 $ 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 activate」を使用するように適切に構成されていません。シェルを初期化するには、$ conda initを実行します現在サポートされているシェルは次のとおりです:-bash-fish-tcsh-xonsh-zsh-powershell「conda init詳細とオプションについては、-help 'を参照してください。重要:' conda init 'を実行した後、シェルを閉じて再起動する必要がある場合があります。

なぜこれが機能しないのですか?

Miniconda Dockerテンプレートを使用して回避策があるかもしれないことを見てきましたが、私はcannotを使用します。 Dockerビルドプロセス中にanaconda環境を作成して切り替えるにはどうすればよいですか?ありがとう!

8
xnet

私はnvidiaイメージでテストしていませんが、 multi-stage Docker builds が役立つはずです。おそらく次のようになります。

# get Miniconda docker image to get a installed conda env; WARNING: That image is Debian based
FROM continuumio/miniconda3:latest AS miniconda


# your Docker commands
FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04

# Set user
ENV SETUSER myuser

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


# Miniconda: get necessary files from build
COPY --from=miniconda /opt/conda /opt/conda
# Set correct permissions
RUN chown -R $SETUSER: /opt/conda
#   New terminals will have conda active
# If nvidia's Docker image has no .bashrc
# COPY --from=miniconda /home/$SETUSER/.bashrc
# else
RUN echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc

# switch Shell sh (default in Linux) to bash
Shell ["/bin/bash", "-c"]

# give bash access to Anaconda, then normal anaconda commands, e.g. (-q: quiet, -y: answer yes)
RUN source /home/$SETUSER/.bashrc \
 && conda create -q --name testy \
 && conda activate testy \
 && conda install -y your_package

このGitHubの問題からのインスピレーション: https://github.com/ContinuumIO/docker-images/issues/89

0
NumesSanguis