Docker ComposeでSecretを使ってホストのssh秘密鍵を共有する
docker上でsshの秘密鍵を使ってsshしたいときのハードル
まず、ContainerImageに埋め込むのは除き、実行時に動的に渡す方法として、以下。
- volumesでホストのファイルを共有する
- secretsでホストのファイルを共有する
共有した場合の問題点としてはハードルになる。
- 共有したファイルパーミッションが755になりsshクライアントでエラーとなる
1 | Warning: Permanently added 'XXXXXXXXXXXXXXXXXXXXX' (RSA) to the list of known hosts. |
そして、Immutableであることによるハードルとして、以下がある。
- UserKnownHostsファイルの追記のための対話型操作
1 | Are you sure you want to continue connecting (yes/no)? |
docker-composeでsecretsを使って秘密鍵を渡す
versionは3.1以降とする必要がある。
1 | version: '3.1' |
entrypoint.shでコピーしてパーミッションを修正する
secrets
によって共有された内容は/run/secrets/
でReadOnlyアクセスが可能だが、パーミッションは755のため、sshコマンドでエラーになってしまう。そのため、ENTRYPOINT
で、コピーしてパーミッションを設定している。
1 |
|
GIT_SSH_COMMANDでGitが実行するsshコマンドオプションを設定する
環境変数GIT_SSH_COMMAND
はGitが実行するsshコマンドを指定することができる。UserKnownHostsFile=/dev/null
でKnownHostsファイルを生成しないようにし、StrictHostKeyChecking=no
で対話型の要求を抑制する。
docker-composeのsecret対応状況
version: '3'
で実行した場合
ERROR: The Compose file ‘.\docker-compose.yml’ is invalid because:
Invalid top-level property “secrets”. Valid top-level sections for this Compose file are: version, services, networks, volumes, and extensions starting with “x-“.You might be seeing this error because you’re using the wrong Compose file version. Either specify a supported version (e.g “2.2” or “3.3”) and place your service definitions under the
services
key, or omit theversion
key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
secretsでパーミッションを指定できない
パーミッション指定に対応しているように見えるが、docker-compose version 1.25.4, build 8d51620a
では利用できなかった。
mode: サービスのタスクコンテナーにおいて /run/secrets/ にマウントされるファイルのパーミッション。 8 進数表記。 たとえば 0444 であればすべて読み込み可。 Docker 1.13.1 におけるデフォルトは 0000 でしたが、それ以降では 0444 となりました。 secrets はテンポラリなファイルシステム上にマウントされるため、書き込み可能にはできません。 したがって書き込みビットを設定しても無視されます。 実行ビットは設定できます。
1 | secrets: |
実行するとサポート対象外のメッセージ。
1 | WARNING: Service "xxxxx" uses secret "host_ssh_key" with uid, gid, or mode. These fields are not supported by this implementation of the Compose file |
docker-composeの定義ファイルのバージョン
version '3.8
の記述がみられるが、docker-compose version 1.25.4, build 8d51620a
では3.3
までしか対応していない。
1 | ERROR: Version in ".\docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1. |