Anaconda/Minicondaのインストール/アンインストール自動化(Linux)

著者: 高久 隆史, 株式会社日立製作所

# はじめに
AnacondaやMinicondaは、Pythonのパッケージ管理を行うためのディストリビューションです。多数のライブラリを管理したPython実行環境として利用できます。
Anaconda/Minicondaのインストール/仮想環境構築/仮想環境破棄/アンインストールは、インストーラの実行やコマンドで実行しますが、何度も構築が必要なケースでは、それらのコマンドを毎回実行していくのに手間がかかります。

本稿では、Linux上で、このAnaconda/Minicondaのインストール/仮想環境構築/仮想環境破棄/アンインストールを自動化する手順を紹介します。
Windowsを前提とした手順は、次の投稿を参照してください。
[Anaconda/Minicondaのインストール/アンインストール自動化(Windows)](https://qiita.com/t-takahisa/items/bc4cc72687e72edd047c)

なお、本稿で利用しているcondaコマンドの細かい説明は記載しておりませんので、condaコマンドをよく知らない方は、必要に応じて次のURLでcondaコマンドの仕様を確認しながら参照してください。
https://docs.conda.io/projects/conda/en/latest/commands.html


# 自動化の前提
・前提OSはLinux(64bit)とします。(本稿の動作確認はRed Hat Enterprise Linux 7および8で実施しています。)
・インストーラはMinicondaを利用します。また、事前にダウンロードしておくものとします。本稿では、「[Miniconda - Conda documentation](https://docs.conda.io/en/latest/miniconda.html)」からダウンロードした「Miniconda3-py38_4.10.3-Linux-x86_64.sh」を利用して動作確認しました。
・「Minicondaのインストール～仮想環境構築」、「仮想環境構築のみ」、「構築した仮想環境に入るためのシェル設定」、「仮想環境破棄のみ」、「Minicondaのアンインストール(仮想環境の破棄含む)」を1回のシェルスクリプトの実行で実施できるようにします。
・「Minicondaのインストール先ディレクトリパス」、「仮想環境名」、「仮想環境にインストールするライブラリ」はシェルスクリプト実行前に指定できるようにします。
・シェルスクリプトの実行に管理者権限は不要とします。
・エラー処理は省略しています。（エラー処理自体は難しくなく、それよりも本質的な処理内容を伝えたいため。）


# 自動化のファイル構成
自動化を行うために作成するファイル一覧を次に記載します。

| # | ファイル名 | 概要 | 
| :- | :- | :- |
| 1 | env.sh | 環境設定用シェルスクリプト | 
| 2 | lib_list.txt | 仮想環境にインストールするライブラリ一覧設定用テキストファイル |
| 3 | install_all_in_one.sh | Minicondaのインストール～仮想環境構築用シェルスクリプト |
| 4 | create_ve.sh | 仮想環境構築用シェルスクリプト |
| 5 | prompt_ve.sh | 構築した仮想環境に入るためのシェル設定用シェルスクリプト |
| 6 | destroy_ve.sh | 仮想環境破棄用シェルスクリプト |
| 7 | uninstall_all_in_one.sh | Minicondaのアンインストール(仮想環境破棄含む)用シェルスクリプト |

なお、ここで記載したシェルスクリプトのエンコードは、構築する環境に合わせて作成してください(本稿で動作確認した際は、構築する環境のデフォルトのエンコードに合わせてUTF-8で作成しました)。また、改行コードはLFで作成してください。

以降で、各ファイルの内容を記載していきます。


# 自動化のファイル作成
## #1 環境設定(env.sh)
環境によって後から変更したい設定をここに記載し、各シェルスクリプトの実行前に、本ファイルを編集してから実行する形にしています。
本稿の自動化では、以下の項目を外出し設定しています。

**外出し設定項目**

| # | 環境変数名 | 設定内容 |
| :- | :- | :- |
| 1 | MINICONDA_EXE_FILE_PATH | Minicondaのインストーラファイルパス |
| 2 | MINICONDA_INST_DIR | Minicondaのインストール先ディレクトリパス |
| 3 | VIRTUAL_ENV_NAME | 仮想環境名 |

**env.shファイルの記載例**

```bash:env.sh
#!/bin/sh

# Minicondaのインストーラファイルパス。
MINICONDA_EXE_FILE_PATH=./Miniconda3-py38_4.10.3-Linux-x86_64.sh

# Minicondaのインストール先ディレクトリパス。
MINICONDA_INST_DIR=~/miniconda3

# 仮想環境名。
VIRTUAL_ENV_NAME=MyVE
```


## #2 仮想環境にインストールするライブラリ一覧設定(lib_list.txt)
仮想環境にインストールするライブラリ一覧をここに改行区切りで記載し、各シェルスクリプトの実行前に、本ファイルを編集してから実行する形にしています。
ライブラリ名一覧のみを指定する例(デフォルトバージョンを利用)、ライブラリ名およびバージョンを指定する例を記載します。

**lib_list.txtの記載例(ライブラリ名のみを指定(デフォルトバージョンを利用))**

```:lib_list.txt
python
jupyterlab
scikit-learn
numpy
pandas
seaborn
optuna
flask
```

**lib_list.txtの記載例(ライブラリ名とバージョンを指定)**

```:lib_list.txt
python=3.8.8
jupyterlab=3.0.14
scikit-learn=0.24.1
numpy=1.20.1
pandas=1.2.4
seaborn=0.11.1
optuna=2.7.0
flask=1.1.2
```


## #3 Minicondaインストールの自動化(install_all_in_one.sh)
Minicondaのインストールは、インストーラファイル(本稿では「Miniconda3-py38_4.10.3-Linux-x86_64.sh」)を利用して実施します。
インストーラをオプションなしでそのまま起動すると、対話形式で開きますが、自動化するためにサイレントモードで実行します。
サイレントモードの仕様は次のURLで確認できます。
https://docs.anaconda.com/anaconda/install/silent-mode/

インストール対象をインストールを実行したユーザのみとして、サイレントインストールするコマンド例を次に示します。

```bash:install_all_in_one.sh(抜粋)
bash $MINICONDA_EXE_FILE_PATH -b -p $MINICONDA_INST_DIR

echo conda initを実行します。
$MINICONDA_INST_DIR/bin/conda init

echo デフォルトでbaseに入らないように設定します。
$MINICONDA_INST_DIR/bin/conda config --set auto_activate_base False
```

上の「conda init」は、「.bashrc」にMinicondaの環境設定を行うために実行しています。また、「conda config」では、デフォルトで「base」という仮想環境に入ってしまわないようにするために実行しています。(本稿では、「base」仮想環境は利用せず、「env.sh」の「VIRTUAL_ENV_NAME」で指定した仮想環境に「lib_list.txt」で指定した任意のライブラリをインストールして利用する手順としており、誤って「base」仮想環境を使わないようにするため。)

「install_all_in_one.sh」自体は、前述した環境設定の読み込みの他、Minicondaインストール～仮想環境構築をまとめて実施できるように、仮想環境構築を行う「create_ve.sh」(内容は後述)の呼び出しも行うようにします。

**install_all_in_one.shの記載例**

```bash:install_all_in_one.sh
#!/bin/sh

echo $(date +"%Y/%m/%d %H:%M:%S") Minicondaのインストール～仮想環境構築を開始します。

# カレントディレクトリを.shのあるディレクトリに移動します。
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE:-$0}")" && pwd)"
cd $SCRIPT_DIR

# 環境設定を読み込みます。
source $SCRIPT_DIR/env.sh

echo Minicondaをインストールします。
bash $MINICONDA_EXE_FILE_PATH -b -p $MINICONDA_INST_DIR

echo conda initを実行します。
$MINICONDA_INST_DIR/bin/conda init

echo デフォルトでbaseに入らないように設定します。
$MINICONDA_INST_DIR/bin/conda config --set auto_activate_base False

# 仮想環境を構築します。
bash $SCRIPT_DIR/create_ve.sh

echo $(date +"%Y/%m/%d %H:%M:%S") Minicondaのインストール～仮想環境構築を終了します。
```


## #4 仮想環境構築の自動化(create_ve.sh)
Minicondaをインストールしたら、仮想環境を新規に構築して、ライブラリをインストールします。
本稿では、conda-forgeを利用して、オンラインでライブラリをインストールする場合の例を記載します。
なお、インターネットに接続せずに、オフラインでインストールしたいという場合は、事前にインストールしたいライブラリをカスタムチャネル化しておき、カスタムチャネル化したライブラリを配置したディレクトリをチャネルとして登録することで実現できます。

カスタムチャネル化については、次の記事を参照してください。
[オフライン本番環境での機械学習実行環境構築シナリオとAnsibleによる構築自動化(前編)](https://qiita.com/yuki-tsutsumi/items/a4cf28110a4ac7908935)

**仮想環境構築の流れ**

| # | 項目 |
| :- | :- |
| 1 | conda環境に入る |
| 2 | 仮想環境を新規作成 |
| 3 | 作成した仮想環境に入る |
| 4 | 仮想環境にライブラリをインストール |

**create_ve.shの記載例**

```bash:create_ve.sh
#!/bin/sh

echo $(date +"%Y/%m/%d %H:%M:%S") 仮想環境構築を開始します。

# カレントディレクトリを.shのあるディレクトリに移動します。
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE:-$0}")" && pwd)"
cd $SCRIPT_DIR

# 環境設定を読み込みます。
source $SCRIPT_DIR/env.sh

echo conda環境に入ります。
source ~/.bashrc

echo 仮想環境を新規作成します。
conda create -n $VIRTUAL_ENV_NAME -y

echo 作成した仮想環境に入ります。
conda activate $VIRTUAL_ENV_NAME

# ライブラリ一覧をスペース区切りにして、変数に設定します。
SPACE=" "
while read LIB_NAME; do
    if [ -z "$LIB_LIST" ]; then
        LIB_LIST="${LIB_NAME}"
    else
        LIB_LIST="${LIB_LIST}${SPACE}${LIB_NAME}"
    fi
done < $SCRIPT_DIR/lib_list.txt

echo conda-forgeからライブラリをインストールします。
conda install -c conda-forge --quiet --yes $LIB_LIST

echo $(date +"%Y/%m/%d %H:%M:%S") 仮想環境構築を終了します。
```

**※ライブラリのインストールのTIPS**
・ライブラリごとにconda installコマンドを何度も実行するよりも、1回のconda installコマンドで複数のライブラリをまとめて実行した方が短時間でインストールできるため、本稿では1回のconda installコマンドで複数のライブラリをまとめてインストールしています。
・プロキシ環境下でインストールする場合、「conda create」コマンド実行前に次のコマンドを実行してください。本コマンドの実行により、conda設定ファイル「<実行したユーザのホームディレクトリ>/.condarc」にプロキシ情報が設定されます。

```
conda config --set proxy_servers.http http://<ユーザID>:<パスワード>@<プロキシサーバのホスト名またはIPアドレス>:<プロキシサーバのポート番号>
conda config --set proxy_servers.https http://<ユーザID>:<パスワード>@<プロキシサーバのホスト名またはIPアドレス>:<プロキシサーバのポート番号>
```


## #5 構築した仮想環境に入るためのシェル設定(prompt_ve.sh)
構築した仮想環境のシェル設定を1回のコマンドで実行するためのシェルスクリプトを作成しておきます。

**prompt_ve.shの記載例**

```bash:prompt_ve.sh
#!/bin/sh

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE:-$0}")" && pwd)"
source $SCRIPT_DIR/env.sh
source ~/.bashrc
conda activate $VIRTUAL_ENV_NAME
```

## #6 仮想環境破棄の自動化(destroy_ve.sh)
ここでは、Minicondaはアンインストールせず、構築した仮想環境の破棄のみを行います。Minicondaごとアンインストールを行う場合は、この後の#7の手順を参照してください。

**仮想環境破棄の流れ**

| # | 項目 |
| :- | :- |
| 1 | conda環境に入る |
| 2 | 仮想環境を除去 |
| 3 | 利用されていないパッケージ、キャッシュを削除 |
| 4 | 不要なディレクトリを削除 |

**destroy_ve.shの記載例**

```bash:destroy_ve.sh
#!/bin/sh

echo $(date +"%Y/%m/%d %H:%M:%S") 仮想環境破棄を開始します。

# カレントディレクトリを.shのあるディレクトリに移動します。
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE:-$0}")" && pwd)"
cd $SCRIPT_DIR

# 環境設定を読み込みます。
source $SCRIPT_DIR/env.sh

echo conda環境に入ります。
source ~/.bashrc

echo 構築した仮想環境を除去します。
conda remove -n $VIRTUAL_ENV_NAME --all -y

echo 利用されていないパッケージ、キャッシュを削除します。
conda clean --all -y

echo 不要なディレクトリを削除します。
rm -rf $MINICONDA_INST_DIR/envs/$VIRTUAL_ENV_NAME

echo $(date +"%Y/%m/%d %H:%M:%S") 仮想環境破棄を終了します。
```

**※仮想環境破棄のTIPS**
・「conda remove」コマンドの仮想環境の除去だけだと、ディスク使用量があまり減りませんが、「conda clean」コマンドによる利用されていないパッケージ、キャッシュの削除も実行することにより、ディスク使用量を減らすことができます。


## #7 Minicondaアンインストール(仮想環境の破棄含む)の自動化(uninstall_all_in_one.sh)
ここでは、Minicondaのアンインストールを行います。
「install_all_in_one.sh」では、内部で「create_ve.sh」を呼び出して、Minicondaのインストールと仮想環境構築をまとめて実行していましたが、アンインストールでは、インストールディレクトリ削除の延長で仮想環境の破棄も実行されるため、「destroy_ve.sh」の呼び出しは行いません。

**Minicondaアンインストールの流れ**

| # | 項目 |
| :- | :- |
| 1 | conda init --reverseを実行 |
| 2 | Minicondaの設定ファイルを削除 |
| 3 | Minicondaのアンインストール |

**uninstall_all_in_one.shの記載例**

```bash:uninstall_all_in_one.sh
#!/bin/sh

echo $(date +"%Y/%m/%d %H:%M:%S") Minicondaのアンインストールを開始します。

# カレントディレクトリを.shのあるディレクトリに移動します。
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE:-$0}")" && pwd)"
cd $SCRIPT_DIR

# 環境設定を読み込みます。
source $SCRIPT_DIR/env.sh

echo conda環境に入ります。
source ~/.bashrc

echo conda init --reverseで.bashrcからconda環境設定を削除します。
conda init --reverse

echo conda設定ファイルを削除します。
rm -rf ~/.condarc ~/.conda

echo Miniconcaをアンインストールします。
rm -rf $MINICONDA_INST_DIR

echo $(date +"%Y/%m/%d %H:%M:%S") Minicondaのアンインストールを終了します。
```

**※MinicondaアンインストールのTIPS**
・仮想環境はMinicondaインストールディレクトリ以下に作られているため、アンインストールの延長で削除されます。
・Minicondaのアンインストールで自動削除されないconda設定ファイルは個別に削除しています。このファイルを削除しないと、将来のMinicondaの再インストール時に失敗する可能性があるためです。[正式な手順](https://docs.anaconda.com/anaconda/install/uninstall/)はanaconda-cleanを利用することですが、anaconda-cleanを利用するには、anaconda-clean自体を仮想環境にインストールしておく必要があること、anaconda-cleanがconda-forgeに存在しないこと、anaconda-cleanを利用してもこの設定ファイルの退避しか実行されないと推測されること、から本稿の手順では利用していません。

# 作成したファイルによるMinocondaのインストール、仮想環境構築、仮想環境破棄、アンインストールを実行する手順
作成したファイルを利用してMinicondaのインストール～仮想環境の構築を実行するには、コマンドプロンプトから以下のように実行します。

```
cd <シェルスクリプトなどを配置したディレクトリ>
bash install_all_in_one.sh >> log.txt 2>&1
```

構築した仮想環境の破棄とMinicondaのアンインストールを行う場合は、上記と同様に「uninstall_all_in_one.sh」を実行します。
仮想環境の破棄だけ実施したい場合は、「destroy_ve.sh」を実行します。
仮想環境の構築だけ実施したい場合は、「create_ve.sh」を実行します。「env.sh」の「VIRTUAL_ENV_NAME」で指定している仮想環境名を変更することで、複数の仮想環境を構築することもできますが、「env.sh」は他のシェルスクリプトでも参照していますので、変更したあとに、「prompt_ve.sh」や「destroy_ve.sh」を実行する際は、意図した仮想環境名に対して実行されるように留意してください。


# 構築した環境の利用手順
「source prompt_ve.sh」を実行して仮想環境シェル設定を実施してから操作します。

**インストールされているライブラリ一覧の確認例**

```
(MyVE) [user1@hostname work]$ conda list
# packages in environment at /home/user1/miniconda3/envs/MyVE:
#
# Name                    Version                   Build  Channel
… (長いので省略)
```

**Pythonコマンドの実行例**

```
(MyVE) [user1@hostname work]$ echo 'print("Hello world!")'> helloworld.py
(MyVE) [user1@hostname work]$ python helloworld.py
Hello world!
```

**Jupyter Labの利用例**

```
(MyVE) [user1@hostname work]$ jupyter lab
```
上記「jupyter lab」コマンドの延長で、ブラウザでJupyter Labのページが開きます。
「jupyter lab」コマンドのコンソールに出力される「 http://localhost:8888/?token=xxx 」のURLを利用して、任意のブラウザで開くこともできます。

Linuxマシンに、WindowsホストマシンのTera Termなどからアクセスしているなどのケースでは、ポートフォワードして、Windowsホストマシンのブラウザから開くこともできます。この場合の手順例を以下に記載します。

① コマンドプロンプトから次のコマンドを実行します。

```bat:
ssh <Linuxマシンのホスト名またはIPアドレス> -L 8888:localhost:8888 -N -l <Linuxマシンのユーザ名>
```

② コマンドプロンプトで入力したユーザ名に対応するパスワードが聞かれるので入力します。
③ 「jupyter lab」コマンドのコンソールに出力される「 http://localhost:8888/?token=xxx 」のURLに、Windowsホストマシンのブラウザからアクセスします。

なお、本投稿時点でのJupyter Labのサポートブラウザは、Firefox, Chrome, Safariとなっており、IEだと開けないため、注意してください。
https://jupyterlab.readthedocs.io/en/latest/getting_started/installation.html?highlight=browser#supported-browsers

本稿の手順で構築した環境で機械学習のデータ分析のコードを動かしてみたい、という場合、次の記事を参考にしてください。
[scikit-learnのサンプルデータセットと主要OSSを活用したデータ分析のチュートリアル](https://qiita.com/a-yanagimura/items/d948856894c54db4d61e)


# おわりに
本稿では、Linux上で、このAnaconda/Minicondaのインストール/仮想環境構築/仮想環境破棄/アンインストールを自動化する手順を紹介しました。
Anaconda/Minicondaの構築に時間がかかっている方のお役に立てれば幸いです。