Dockerで環境変数を設定してPythonに表示してみたよ


目標

docker runコマンドの際に設定した環境変数を、コンテナ内のシェルスクリプトで実行したPythonでprintする。

想定

お仕事でAmazon ECSで環境変数(SMTPサーバー情報など)付きのdocker runコマンドを定時実行し、Pythonで環境変数を基に渡されたSMTPサーバー情報を基にメール定時送信システムを構築中。そのための自宅でのお試し環境変数いじり。

環境

PC:windows 10 home
docker tool-box

$ docker version
Client:
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.7
 Git commit:        74b1e89e8a
 Built:             Wed Jul 31 15:18:18 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea838
  Built:            Wed Nov 13 07:28:45 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

とりあえずPythonのコンテナを立てる

$ docker run --env-file=env.txt -v /c/Users/.../environment_variable_test/code:/code -it python:3.6 bin/bash
root@82a5c3949b49:/#

docker runコマンドの実行はenv.txtのディレクトリで。
--env-file=env.txtで環境変数をしている。
ちなみに、env.txtは、

env.txt
AAA=asdfgg
BBB=bnmbnm
CCC=cvbnm

環境変数はAAA, BBB, CCCの3つ。
せっかくなので別ファイルに分離させてみました。
docker runの環境変数設定はこちらに細かく載ってました↓
https://qiita.com/KEINOS/items/518610bc2fdf5999acf2

asdfgg, bnmbnm, cvbnをpythonで表示させたら勝ち。

-v /c/Users/.../environment_variable_test/code:/codeはディレクトリマウント。
ホスト側とdocker内のディレクトリが同期する。

ちなみにちゃんと環境変数が書き込まれてるが確認
参考:https://www.kabegiwablog.com/entry/2018/07/25/100000

root@82a5c3949b49:/# env | grep -e "AAA\|BBB\|CCC"
AAA=asdfgg
BBB=bnmbnm
CCC=cvbnm
root@82a5c3949b49:/#

シェルスクリプトとPythonファイルつくる

/c/Users/.../environment_variable_test/codeに作る。

test.sh
#!/bin/sh
python test.py $AAA $BBB $CCC
echo "OK"

ハマりどころは1行目の#!/bin/sh入れないと.shと認識してくれない
あと、環境変数は$を付ける
test.pyに引数として環境変数たちを渡す。

echo "OK"はシェル上でOKと表示してくれる。おまけ。

test.py
#!/usr/bin/env python
import sys

args = sys.argv

print("第1引数:" + args[1])
print("第2引数:" + args[2])
print("第3引数:" + args[3])

こちらも1行目に#!/usr/bin/env python入れないと.pyと認識してくれない。
Pythonでの引数の操作はこちらを参照して↓
https://qiita.com/orange_u/items/3f0fb6044fd5ee2c3a37

root@82a5c3949b49:/code# bash test.sh
第1引数:asdfgg
第2引数:bnmbnm
第3引数:cvbnm
OK
root@82a5c3949b49:/code#

よっしゃ!OK!

蛇足ですが、#!/bin/sh: No such file or directoryとか出たら、各ファイルの文字コードを確認しましょう。

test.sh: line 1: #!/bin/sh: No such file or directory
第1引数:asdfgg
第2引数:bnmbnm
第3引数:cvbnm
OK

初心者の僕はメモ帳で開いて文字コード直して上書きしました
誤:UTF-8(BOM付き)
正:UTF-8

展望

Dockerfileにもまとめておきたいね。

今回使ったコードGitHubに載せました(コピペの方が早いけどw)