Volumeを使わずにDockerコンテナに安全にCredentialを渡す
コンテナ化されたアプリケーションからGCP,AWSなどクラウド上のリソースにアクセスする場合、Credentialを適切な方法でコンテナ内に渡す必要があります。
ほとんどのケースではVolumeMountで大丈夫なのですが、Volumeを使わずに実施する必要があって悩んだのでメモしておきます。
前提
コンテナにCredentialを渡す場合、Dockerfileに記述してしまうのが一番早いのですがそれは好ましくありません。 コンテナ実行時にCredentialを引き渡すのが推奨されている方法のようです。 これはDockerfileに記述してしまうと、Credentialが変わるたびにビルドが必要になってしまうためです。
方法
コンテナ起動時にCredentailを渡す必要があるので、entrypointに処理を挟みます。 Credentialは環境変数にセットすることにしました。
Dockerfile内で
COPY docker-entrypoint.sh /usr/local/bin RUN chmod +x /usr/local/bin/docker-entrypoint.sh ENTRYPOINT ["docker-entrypoint.sh"]
と記述して任意のスクリプトを実行できるようにしておきます。 docker-entrypoint.sh はこれです。
#!/bin/sh set -e if [ -n "$CREDENTIAL" ]; then mkdir /.secrets printf '%s' "$CREDENTIAL" > /. secrets/crendential.json fi exec "$@"
アプリケーションは、CMDに実行するために必要なコマンドを記載し、アプリケーション内で /. secrets/crendential.json を読み込めばokになります。
docker run する場合はこうなります。
CREDENTIAL = `cat path/to/credential.json` export $CREDENTIAL docker run -e CREDENTIAL=$CREDENTIAL image
docker-composeの場合はこんな感じ
- environment: - "CREDENTIAL=${CREDENTIAL}"