3
0

More than 3 years have passed since last update.

Dockerで環境変数を秘密情報として扱う方法

Last updated at Posted at 2021-08-14

はじめに

「環境変数を使って接続の設定をすることは開発時には一般的にOKですが、本番環境では非常にお勧めできません」という情報がありましたので、普段使っている環境でsecretsを使う方法を実際に試してみました。
Laravelなどでは、環境変数はフレームワーク側のenvファイルで取り扱うことが多いため、この手法を使うことはあまりないかもしれませんが備忘録として記事にまとめたいと思います。

動作確認環境

  • Windows10 Home
  • wsl2
  • Docker Desktop for Windows
  • Ubuntu20.04 LTS

サンプルのdockerfile

version: "3.9"
volumes:
  db-store:
services:
  db:
    build:
      context: .
      dockerfile: ./infra/docker/mysql/Dockerfile
    ports:
      - target: 3306
        published: 3306
        protocol: tcp
        mode: host
    volumes:
      - type: volume
        source: db-store
        target: /var/lib/mysql
        volume:
          nocopy: true
    secrets:
      - db_root_password
      - db_user_password
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_USER=db_user
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
      - MYSQL_PASSWORD_FILE=/run/secrets/db_user_password
secrets:
  db_root_password:
    file: ./root_password.txt
  db_user_password:
    file: ./user_password.txt

root_password.txtの中身の例 ↓

rootnopassword

secretの仕組み

secret指定すると、指定したファイルの内容を/run/secrets/以下にマウントしてくれます。
MySqlのイメージではMYSQL_ROOT_PASSWORD_FILEといったような形で「_FILE」と付けてあげるとファイルから環境変数を読み取ることができるようになります。
これら2つを組み合わせ、環境変数を秘密情報として扱うことができるようになります。

トラブルシューティング

「MYSQL_ROOT_PASSWORD_FILE」の指定は、「mysql:8.0」イメージで使えます。
イメージによっては使えないので注意しましょう。

トラブルシューティング2

マウントされるパスワードは、スペース、キャリッジリターン、および最後の改行も保存されます。
パスワードを保存してあるファイルは最低限の内容のみにしましょう。

トラブルシューティング3

シークレット情報を保存するファイルの権限は0444にする必要があるようです。
もし上手く読み込みがされない場合は、マウントもとファイルのファイル権限を読み取り専用に変更して下さい。

chmod 0444 {ファイル名}

注意点

DockerfileのENVやARGを使い環境変数を設定すると、Docker imageに変数の中身が残ってしまうため注意しましょう。

参考ページ

3
0
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
3
0