はじめに
Dockerで起動したコンテナにSSHでログイン後に、コンテナ起動時に指定した環境変数は取得することができないようになっています。
下記コマンドの様にコンテナ起動時にシェルを立ち上げればいいだけの話ですが、
ホストOSログイン→コンテナ起動という手順を省きたいです。
$ docker run -e RAILS_ENV=production -it centos /bin/bash
SSHでログインできるコンテナ作成
Dockerfileを以下の様に作成します。
※Dockerfile構造の簡易化のためパスワード無しでログインできるようにしてあります。
FROM centos:7
RUN yum install -y openssh-server initscripts
RUN /usr/sbin/sshd-keygen
RUN echo 'PermitEmptyPasswords yes' >> /etc/ssh/sshd_config
RUN useradd suzuki
RUN passwd -u -f suzuki
CMD /usr/sbin/sshd -D
コンテナを起動します。
$ docker build -t sshtest .
$ docker run -p 23:22 -it sshtest
ホストOSのIPの23番ポートでSSH接続できるようになったので、
Teratermなどを使ってログインします。
環境変数を設定する
コンテナ起動時に環境変数を設定します。
docker run -e RAILS_ENV=production -p 23:22 -it sshtest
コンテナ起動後にSSHでログインして環境変数を確認してみます。
[suzuki@1d3c9ac47cb9 ~]$ env | grep RAILS_ENV
上記の様に何も出力されません…
そこで、コンテナ起動時にenvコマンドで出力される変数一覧を一時ファイルとして保存しておき、SSH接続時に読み込むようにします。
Dockerfileを以下の様に変更します。
FROM centos:7
RUN yum install -y openssh-server initscripts
RUN /usr/sbin/sshd-keygen
RUN echo 'PermitEmptyPasswords yes' >> /etc/ssh/sshd_config
RUN useradd suzuki
RUN passwd -u -f suzuki
+COPY setenv.sh /tmp/setenv.sh
+RUN chmod 755 /tmp/setenv.sh && echo 'source /tmp/setenv.sh' >> /home/suzuki/.bashrc
+CMD /usr/bin/env | grep -E '.+_' > /tmp/environment && /usr/sbin/sshd -D
-CMD /usr/sbin/sshd -D
envコマンドの出力結果を/tmp/environmentに保存します。この際全て保存するとsourceコマンド読み込む際に不都合が生じるので、必要な分だけ読み込めるようにgrepで調整します。
環境変数読み込み用にシェルスクリプトを用意してSSH接続時に実行してやります。
以下が環境変数読み込み用のシェルスクリプトになります。
#!/usr/bin/sh
while read line
do
export $line
done < /tmp/environment
これで起動して確認してみます。
$ docker build -t sshtest .
$ docker run -e RAILS_ENV=production -p 23:22 -it sshtest
[suzuki@0fb134c7eb47 ~]$ env | grep RAILS_ENV
RAILS_ENV=production
おわりに
開発環境でサーバに接続して作業したい場合は、この方法でやれば仮想環境を立ち上げるだけですぐに開発ができるようになります。
参考