Dockerfile内で仮想環境を作成し,conda actiavteしようとするが,できない.仕方がないのでbase環境のまま作成するが,デフォルトでnumpyやらpandasやらが,defaults channelからインストールされているため,違うチャンネルのパッケージをインストールしようとするとbuildまでに時間がかかったり,conflictしてインストールできなかったりした.

これらを解決するために

  1. 仮想環境をactivateする.
  2. 立ち上げた後もその環境にいられるようにする方法

をとったのでメモする.

使用した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

Anaconda の公式 Docker イメージがアクティベーションしないと使えなくなった件 - Qiita

らしい.これとは少し状況ややりたいことが違うけれど.

解決方法

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だった.

参考