LoginSignup
20
18

More than 5 years have passed since last update.

DockerコンテナにSSHする際に環境変数を引き継ぐ

Last updated at Posted at 2016-02-12

はじめに

Dockerで起動したコンテナにSSHでログイン後に、コンテナ起動時に指定した環境変数は取得することができないようになっています。
下記コマンドの様にコンテナ起動時にシェルを立ち上げればいいだけの話ですが、
ホストOSログイン→コンテナ起動という手順を省きたいです。

$ docker run -e RAILS_ENV=production -it centos /bin/bash

SSHでログインできるコンテナ作成

Dockerfileを以下の様に作成します。
※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を以下の様に変更します。

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接続時に実行してやります。

以下が環境変数読み込み用のシェルスクリプトになります。

setenv.sh
#!/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

おわりに

開発環境でサーバに接続して作業したい場合は、この方法でやれば仮想環境を立ち上げるだけですぐに開発ができるようになります。

参考

20
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
18