Dockerfileでconda activateする方法
Dockerfile内で仮想環境を作成し,conda actiavte
しようとするが,できない.仕方がないのでbase
環境のまま作成するが,デフォルトでnumpyやらpandasやらが,defaults channelからインストールされているため,違うチャンネルのパッケージをインストールしようとするとbuildまでに時間がかかったり,conflictしてインストールできなかったりした.
これらを解決するために
- 仮想環境をactivateする.
- 立ち上げた後もその環境にいられるようにする方法
をとったのでメモする.
使用したdocker image: continuumio/anaconda3:2021.05
sw_vers
ProductName: macOS
ProductVersion: 11.5.1
BuildVersion: 20G80
docker version
Client:
Cloud integration: 1.0.17
Version: 20.10.8
API version: 1.41
Go version: go1.16.6
Git commit: 3967b7d
Built: Fri Jul 30 19:55:20 2021
OS/Arch: darwin/arm64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.8
API version: 1.41 (minimum version 1.12)
Go version: go1.16.6
Git commit: 75249d8
Built: Fri Jul 30 19:53:34 2021
OS/Arch: linux/arm64
Experimental: false
いつ困ったのか
continuumio/anaconda3:2021.05上に,
conda install -y -c conda-forge lightgbm==3.2.1
がconflictしてできなかった.
何とconflictしているかを調べるのがあまりにも時間がかかるのでやらなかったが,自分のmac上のanacondaではうまくインストールできていることを考えるとdefaultsチャンネルですでにインストールされているなにかとconflictしていると考えるのが自然と思った.(imageの中にすでにscikit-learnなどいくつかの主要なパッケージがdefaultsチャンネルでインストールされている.)
そこで,純conda-forgeの仮想環境を自分でconda activate
して作ろうと思った.しかし,conda create -n env_name python=3.8.8
で仮想環境の作成はできたが,conda activate env_name
ができなかった.
Anaconda 公式的には「明示的に conda activate する」が正しく、アクティベートせずに使えていた以前の方が誤りらしい。1
らしい.これとは少し状況ややりたいことが違うけれど.
解決方法
Githubのissueに対するこの回答とこの回答を参考にプラス一手間加えてDockerfileを書き換えた.
具体的なDockerfileの内容
# Base image
FROM continuumio/anaconda3:2021.05
# Add conda-forge channel
RUN conda config --add channels conda-forge
# Create myenv
ARG env_name=myenv
RUN conda create -yn ${env_name} python=3.8.8
# Activate environment
ENV CONDA_DEFAULT_ENV ${env_name}
# Switch default environment
RUN echo "conda activate ${env_name}" >> ~/.bashrc
ENV PATH /opt/conda/envs/${env_name}/bin:$PATH
# Install some packages from conda-forge
RUN conda install -y lightgbm==3.2.1
これでやると成功した.
conda activate
コマンドを実行するのではなく,環境変数や.bashrcをいい感じに変えて,そもそものデフォルトの環境を切り替えてしまうというやり方.
せっかくDockerfileで書いているので,変数名に仮想環境の名前を入れて繰り返し書くことを避けて,コピペしやすいようにした.
こうすれば別の名前にするときも簡単.
追記 (2022/3/16) - ARM対応について
使用していたDockerイメージ(continuumio/anaconda3:2021.05)では,AMD(インテルチップ)のみ対応していたため,M1 Mac(ARMチップ)で実行すると,実行はできるが,とても時間がかかった.
さらに,タグをlatestとすると,勝手にdebian系でなく,amazon linux系になり,aptが使えなくて不便だったりした.
しかし,後継のイメージ(continuumio/anaconda3:2021.11)はARMなどマルチアーキテクチャに対応しているため,こちらを使うとよさそう.本記事の該当部分を書き換えるだけでOKだった.