Docker の起動スクリプトや docker-compose.yml を git で管理していると、パスワードなどのクレデンシャル情報の扱いに困ることがよくあります。
もし実行環境がAWSにあるのなら、credstash というツールを使うとクレデンシャル情報の管理が簡単にできます。AWS以外の環境ではあまり使えません。
credstash はクレデンシャル情報を KMS を用いて暗号化した上で DynamoDB に保存してくれるツールです。
KMS や DynamoDB にアクセスする権限は IAM Role により制御できるため、例えば ansible vault のように、マスターパスワードを持つ必要がありません。
credstash については https://qiita.com/winebarrel/items/71e534f294a10224cbd3 などで詳しく紹介されているので、こちらをご覧ください。
この記事では docker と credstash を組み合わせて使う例を2つほど紹介します。
その1 ~ docker
コマンドから渡す
docker run
コマンドは -e
オプションで環境変数を渡すことができます。
例えば、次のような起動スクリプトを書くことができます。
docker run -e MY_PASSWORD=$(credstash get my-password) my-image
その2 ~ CMD
内部で取得する
docker 起動時にコンテナ内部でクレデンシャル情報を取得する方法です。
コンテナ内部から credstash を利用する場合、 credstash のGo版である gcredstash がバイナリ1つでインストールできるので便利です。
FROM ubuntu
...
RUN curl -L https://github.com/winebarrel/gcredstash/releases/download/v0.3.5/gcredstash-v0.3.5-linux-amd64.gz > /usr/local/bin/gcredstash \
&& chmod +x /usr/local/bin/gcredstash
...
CMD MY_PASSWORD=$(gcredstash get my-password) \
./run-my-app
docker build 時ではなく、コンテナ起動時に gcredstash を呼び出すため、ENV
コマンドではなく CMD
コマンドでクレデンシャルを取得する必要があることに注意です。
この方法は、特に docker-compose で ECS の実行環境を管理している場合に便利です。
例えば、次のような docker-comose.yml を用いると、dockerイメージに手を加えることなくクレデンシャルを渡すことができます。
ECS コンソールにもクレデンシャル情報は表示されません。
service: '2'
---
services:
app:
...
volumns:
- /path/to/gcredstash:/usr/local/bin/gcredstash
command: |
bash -lc '
MY_PASSWORD=$$(gcredstash get my-password) \
./run-my-app
'