Dockerでsshログインする際に環境変数が反映されない課題の解決法。sshを使用するコンテナは機械学習の環境構築用を想定。
(pythonとpycharmnでsshログインして使用、など)
1.背景と課題
一般にDockerfileで環境変数を使う際は、ENVを使う。
#ENV 環境変数名 パス
ENV SPARK_HOME /usr/local/spark
しかし、Dockerやkubernetsへsshでログインすると、この記法ではPATHなど一部の環境変数が反映されない課題がある。
名前が被らない環境変数は/etc/environmentに記入することで対応可能。
RUN echo "export SPARK_HOME=/usr/local/spark" >> /etc/environment
しかし、PATHなど元々存在する環境変数にはこの方法が通用しない。
対策として~/.ssh/environment を使う方法が散見されるが、この方法はsshコマンド実行直後にしか環境変数は反映されない。
2.原因
PATHなどの環境変数が反映されない問題はssh経由のBash起動時に.bashrcを読み込まない事が原因である。
3.対策
.bash_profileにを作成して.bashrcを読み込ませて対策を行う。
#.bash_profileを作成し、.bashrcを読み込む(シェルスクリプト)
RUN echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >>~/.bash_profile
# 環境変数の書き込み(PATHへ/usr/local/spark/binの追加)
RUN echo "PATH=${PATH}:/usr/local/spark/bin" >> ~/.bashrc
rootユーザー以外の場合は出力先を下記に書き換える
/home/ユーザー名/.bash_profile
/home/ユーザー名/.bashrc
以上