koukiblog

たぶんweb系の話題

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}"

検証した環境はGCPだったのですが、おそらくAWSでも同じようにできると思います