> For the complete documentation index, see [llms.txt](https://docs.keeper.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.keeper.io/keeperpam/jp/secrets-manager/integrations/docker-runtime.md).

# Dockerランタイム

![](/files/DZm4f1SmRnX4A6I0FuQO)

## 機能

* Dockerコンテナ実行時にKeeperボルトからシークレットを動的に取得

{% hint style="info" %}
Keeperシークレットマネージャーの機能一覧については、[概要](/keeperpam/jp/secrets-manager/overview.md)をご参照ください。
{% endhint %}

## 前提条件

本ページでは、シークレットマネージャーとDockerランタイムとの連携について取り扱います。本連携を利用するには、以下が必要です。

* Keeperシークレットマネージャーへのアクセス（[クイックスタートガイド](/keeperpam/jp/secrets-manager/quick-start-guide.md)をご参照ください）
  * Keeperのサブスクリプションでシークレットマネージャーアドオンが有効になっていること
  * シークレットマネージャーポリシーが有効なロールに所属していること
* シークレットが共有されているKeeper [シークレットマネージャーアプリケーション](/keeperpam/jp/secrets-manager/about/terminology.md#application)
  * アプリケーションの作成手順については、[クイックスタートガイド](https://docs.keeper.io/keeperpam/jp/secrets-manager/integrations/pages/-MeRAVfQmDBzKQBC0f_c#2.-create-an-application)をご参照ください
* [ワンタイムアクセストークン](/keeperpam/jp/secrets-manager/about/one-time-token.md)
* [Keeperシークレットマネージャー（KSM）CLIツール](/keeperpam/jp/secrets-manager/secrets-manager-command-line-interface.md)
  * KSM CLIの設定手順については、[こちら](/keeperpam/jp/commander-cli/commander-installation-setup.md)をご参照ください

## 概説

KeeperシークレットマネージャーはDockerランタイムと連携しており、コンテナ実行時にボルトからシークレットを動的に取得できます。

`ksm` コマンドでコンテナ起動時に環境変数を設定すれば、デプロイメントスクリプトへのハードコーディングを避けられます。以下に実装例を示します。

## 例: MySQLネットワークユーザーアカウントのプロビジョニング

公式の[MySQL docker](https://hub.docker.com/_/mysql/)を使用すると、ユーザーはMySQL rootパスワードを設定し、環境変数を使用してネットワークアクセス可能なユーザーを作成できます。MySQLインスタンスは、コンテナの実行時にプロビジョニングされます。

公式のMySQL Dockerfileは以下のとおりです。

```
FROM debian:buster-slim
	
...
... INSTALL MySQL 8.0 SERVER
...
	
ENTRYPOINT ["docker-entrypoint.sh"]
​
EXPOSE 3306 33060
CMD ["mysqld"]
```

標準実装では、ENTRYPOINTがコンテナのプロビジョニングを担当し、渡された環境変数を使ってMySQLを設定します。参照される環境変数は以下のとおりです。

* MYSQL\_ROOT\_PASSWORD
* MYSQL\_USER
* MYSQL\_PASSWORD
* MYSQL\_DATABASE

以下の手順では、Keeperボルトに格納されたシークレットを使用してMySQLデータベースを初期化する方法を示します。

**手順 1:** シークレットを格納する2つのボルトレコードを作成

シークレットマネージャーアプリケーションが管理する2つのレコードをボルトに作成します。一方にはrootパスワード、もう一方には通常ユーザー、パスワード、データベース名を格納します。

![MySQL DBのroot](/files/QAhaTd7QyQ9sjQNdtQM4)

![MySQL DBのユーザー](/files/NSHpJsiCN046kZHVe9ql)

ボルトのレコードに表示されるレコードUIDを必ずコピーしてください。手順3でボルトのシークレットを参照するときに使用します。

![rootレコードのレコードUIDを取得](/files/8uyXAmVBRF2qLgI8qFj9)

![ユーザーレコードのレコードUIDを取得](/files/WzUWhWgQvFS7hz36aeDv)

**手順 2:** デフォルトのMySQL DockerfileをベースにしたDockerfileを作成

KeeperシークレットマネージャーCLI（`ksm`）をインストールし、`ksm exec` でENTRYPOINTをラップするDockerfileを作成します。

以下のDockerfileでは、[Keeper表記法](/keeperpam/jp/secrets-manager/about/keeper-notation.md)を使用して4つの環境変数を置き換えています。また、シークレットが格納されているボルトを示すシークレットマネージャープロファイルも渡します。

```
FROM mysql:debian

ARG BUILD_KSM_INI_CONFIG
ARG BUILD_ROOT_UID
ARG BUILD_USER_UID

RUN apt-get update && \
  apt-get install -y python3 python3-pip python3-venv && \
  apt-get clean

# 干渉する可能性のあるシステムインストールモジュールは使用しない
ENV VIRTUAL_ENV /venv
RUN python3 -m pip install --upgrade pip && \
  	python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

# ディストリビューションに含まれるPythonが古すぎて、新しいモジュールのインストールに支障があるかもしれないため、pipをアップグレード
RUN pip3 install --upgrade pip

# KeeperシークレットマネージャーCLIをインストール
RUN pip3 install keeper-secrets-manager-cli

# 設定をインポートしてデコードし、ksmが検出可能な場所に保存
RUN ksm profile import $(printenv --null BUILD_KSM_INI_CONFIG)

ENV MYSQL_ROOT_PASSWORD keeper://${BUILD_ROOT_UID}/field/password
ENV MYSQL_USER          keeper://${BUILD_USER_UID}/field/login
ENV MYSQL_PASSWORD      keeper://${BUILD_USER_UID}/field/password
ENV MYSQL_DATABASE      keeper://${BUILD_USER_UID}/custom_field/database
​
ENTRYPOINT ["ksm", "exec", "--", "docker-entrypoint.sh"]
```

**手順 3:** dockerビルドを実行するシェルスクリプトを作成

docker buildを実行するには、以下のスクリプトでシークレットマネージャーのデバイス設定と、シークレットを含むボルトのrootユーザーのレコードUIDとネットワークユーザーのレコードUIDを渡します。

```bash
#!/bin/sh
​
​export CF=$(ksm profile export)

docker build \
  --build-arg "BUILD_KSM_INI_CONFIG=${CF}" \
  --build-arg "BUILD_ROOT_UID=DvpMcO4xV5nZF6jqLGF1fQ" \
  --build-arg "BUILD_USER_UID=VNxZvvNAZ8j2mL4WIjEzjg" \
  -t mysql_custom \
  .
  
```

## 例: KSM CLI Dockerイメージの使用

[KSM CLI Docker](/keeperpam/jp/secrets-manager/secrets-manager-command-line-interface/docker-container.md)には、GLIBC（ほとんどのLinuxディストリビューション）とMUSL（Alpine Linux）の両方のCLIバイナリへのボリュームマウントが含まれています。ボリュームは `/cli` です。このディレクトリは、docker-composeの `volumes_from` またはコマンドラインdockerの `-v` を使用して、別のコンテナにマウントできます。`ksm` の実行可能ファイルは、Linuxディストリビューションが使用しているCライブラリのバージョン別のディレクトリにあります。

* `/cli/glibc/ksm`: Ubuntu、Debian、Fedora、CentOSなどの標準GLIBCディストリビューション
* `/cli/musl/ksm`: Alpine Linux

たとえば、CLIバイナリにアクセスする方法を示す簡単なフレームワークを以下に示します。

```
---
version: "2"
services:
  init:
    image: keeper/keeper-secrets-manager-cli:latest
  main:
    image: ubuntu:latest
    volumes_from:
      - init:ro
    command: [ '/cli/glibc/ksm', 'exec', 'printenv', 'MY_LOGIN' ]
    environment:
      KSM_CONFIG: ewog ... M09IemdQMnc9Igp9
      MY_LOGIN: keeper://bf18xLR3aVut5eYy7oIZZZ/field/login
      LC_ALL: C.UTF-8
      LANG: C.UTF-8
    depends_on:
      init:
        condition: service_completed_successfully
```

`init` サービスはCLI dockerをロードします。コンテナが起動し、CLIのスプラッシュ画面が表示されてから終了します。コンテナが停止しても、`/cli` ボリュームには他のコンテナから引き続きアクセスできます。

`main` サービスは `volumes_from` を使用して、CLI dockerのボリュームをディレクトリ `/cli` にマウントします。`command` でオーバーライドして、KSM CLIのGLIBCバージョンを実行します。`command` はCLIの `exec` 機能を使用します。これにより、[Keeper表記法](/keeperpam/jp/secrets-manager/about/keeper-notation.md)を使用する環境変数がシークレット値に置き換えられます。CLIの `exec` コマンドは `printenv` を実行し、Keeper表記法に設定された環境変数**MY\_LOGIN**の値を、シークレットに置き換えて表示します。

```
$ example : docker-compose up
[+] Running 2/0
 ⠿ Container example-init-1  Created                                                                                                                      0.0s
 ⠿ Container example-main-1  Recreated                                                                                                                    0.1s
Attaching to example-init-1, example-main-1
example-init-1  |
example-init-1  | ██╗  ██╗███████╗███╗   ███╗     ██████╗██╗     ██╗
example-init-1  | ██║ ██╔╝██╔════╝████╗ ████║    ██╔════╝██║     ██║
example-init-1  | █████╔╝ ███████╗██╔████╔██║    ██║     ██║     ██║
example-init-1  | ██╔═██╗ ╚════██║██║╚██╔╝██║    ██║     ██║     ██║
example-init-1  | ██║  ██╗███████║██║ ╚═╝ ██║    ╚██████╗███████╗██║
example-init-1  | ╚═╝  ╚═╝╚══════╝╚═╝     ╚═╝     ╚═════╝╚══════╝╚═╝
example-init-1  |
example-init-1  | Current Version: 1.0.13
example-init-1  |
example-init-1  | Running in shell mode. Type 'quit' to exit.
example-init-1  |
example-init-1 exited with code 0
example-main-1  | john.smith@localhost
example-main-1 exited with code 0
```

## 例: KSM CLI Dockerと他のベンダーのDockerイメージの併用

上記の例と同様に、カスタムDockerイメージを作成せずに、KSM CLI dockerを使用して、別のベンダーのDockerイメージのエントリポイントとコマンドをオーバーライドできます。

この例では、最初の2つの例を組み合わせます。

この例では、Docker HubリポジトリからDockerイメージを取得し、DockerfileがGitHubに公開されていることを前提としています。

#### オペレーティングシステムのディストリビューション

最初の手順は、ベンダーのDockerイメージがどのオペレーティングシステムのディストリビューションに基づいて作成されているかを判定することです。通常はタグ名で判定できます。たとえば、イメージタグ名に「alpine」が含まれている場合は、Alpine Linuxであることがわかります。

イメージタグ名にディストリビューションが示されていない場合は、そのイメージのDocker Hubウェブページで、「サポートされているタグ（Supported tags）」セクションのタグ名をクリックします。すると、Dockerfileの内容が表示されます。**FROM**ステートメントは、ベンダーがイメージ作成のベースにしたディストリビューションを示します。**FROM**ステートメントで判明しない場合は、継承した**FROM**イメージのDockerfileをご確認ください。

<figure><img src="/files/gTifwCqFr1uyVb5zQW82" alt=""><figcaption></figcaption></figure>

MySQL 8.0.31は、タグ名にオペレーティングシステムのディストリビューションを示しません。MySQL Docker Hubページでは、8.0.31タグがGitHubリポジトリにリンクしています。このDockerfileから、ディストリビューションがOracle Linuxであることがわかります。

<figure><img src="/files/c4q6JPeOUumUd9wVTK4F" alt=""><figcaption></figcaption></figure>

ディストリビューションをチェックする目的は、どのバージョンの**libc**ライブラリが使用されているかを確認することです。ほとんどのディストリビューションは**GLIBC**を使用していますが、一部（主にAlpine Linux）は**MUSL**を使用しています。これは、KSM CLI Dockerイメージから正しいバイナリを選択するために必要です。間違ったバイナリを選択すると、`exec /cli/musl/ksm: no such file or directory`または`exec /cli/glibc/ksm: no such file or directory`のようなエラーが表示されます。この例では、Oracle Linuxは**GLIBC**ディストリビューションです。

#### エントリーポイントとコマンド

続いて、ベンダーのDockerイメージの**ENTRYPOINT**と**CMD**を特定します。Dockerfileには、**ENTRYPOINT**と**CMD**の両方、またはいずれか一方が記載されます。

<figure><img src="/files/zjxV16R3ROYos4zQUrBq" alt=""><figcaption></figcaption></figure>

このMySQL Dockerfileでは、**ENTRYPOINT**は `["docker-entrypoint.sh"]` で、**CMD**は `["mysqld"]` です。つまり、**ENTRYPOINT**は**CMD**の先頭に追加されるため、コンテナ起動時に `docker-entrypoint.sh mysqld` が実行されます。

#### `docker-compose.yml`

docker-composeでは2つのサービスを使います。

**init**サービスは `keeper/keeper-secrets-manager-cli` Dockerイメージのボリュームを読み込みます。このイメージは起動して終了しますが、終了後もボリュームには引き続きアクセスできます。

**main**サービスは**init**サービスの後に実行されます。docker-composeの `depends_on` ディレクティブで制御します。このサービスには、KSM CLI `exec` コマンドで置き換えられる [表記法](/keeperpam/jp/secrets-manager/about/keeper-notation.md) を使用した環境変数と、KSM CLIに必要なBase64でエンコードされた設定が含まれます。MySQL Dockerイメージのデータベースプロビジョニングで使用する**MYSQL\_**&#x74B0;境変数もここで設定します。

また、mainサービスは `volumes_from` を使用してinitサービスからボリュームをマウントします。KSM CLI Dockerイメージには、ボリュームをエクスポートして**main**サービスコンテナにマウントする場所が定義されています。バイナリは `/cli`（**libc**バージョンと `ksm` バイナリ名が続く）にマウントされます。

```
version: '3.0'
services:
  init:
    image: keeper/keeper-secrets-manager-cli:latest
  main:
    image: mysql:8.0
    environment:
      KSM_CONFIG: "ewog .... RQ3pQMnc9Igp9"
      MYSQL_USER: "keeper://KOJLz4Wzbqfi9xUO-VMViA/field/login"
      MYSQL_PASSWORD: "keeper://KOJLz4Wzbqfi9xUO-VMViA/field/password"
      MYSQL_ROOT_PASSWORD: "keeper://KOJLz4Wzbqfi9xUO-VMViA/custom_field/Root Password"
      MYSQL_DATABASE: "keeper://KOJLz4Wzbqfi9xUO-VMViA/custom_field/Database"
    depends_on:
      init:
        condition: service_completed_successfully
    entrypoint: ["/cli/glibc/ksm", "exec", "docker-entrypoint.sh"]
    command: ["mysqld"]
    ports:
      - "3306:3306"
    volumes_from:
      - init:ro
```

MySQLイメージはOracleディストリビューション（**GLIBC**ディストリビューション）を使用するため、mainサービスは `/cli/glibc/ksm` バイナリを使用します。

**main**サービスは、MySQLイメージの**ENTRYPOINT**と**CMD**をオーバーライドします。**entrypoint**と**command**を使用して実行します。エントリポイントは、KSM CLIの `exec` コマンドで元の**ENTRYPOINT** `docker-entrypoint.sh` を実行します。**command**は同じですが、`docker-compose.yml` で設定する必要があります。設定しないと、サービスは終了します。

使用しているDockerイメージによっては、**ENTRYPOINT**と**CMD**のいずれか一方、またはその両方のオーバーライドが必要になる場合があります。

#### 結果

サービス起動時、**init**サービスが最初に実行され、コード0で正常終了します。その後**main**サービスが起動し、KSM CLIの `exec` コマンドを実行してから `docker-entrypoint.sh mysqld` が実行されます。この時点で環境変数はシークレットに置き換えられ、MySQLがプロビジョニングされ、`mysqld` が稼働しています。

```
$ my_mysql : docker-compose up
[+] Running 3/3
 ⠿ Network my_mysql_default   Created                                                                                                          0.0s
 ⠿ Container my_mysql-init-1  Created                                                                                                          0.1s
 ⠿ Container my_mysql-main-1  Created                                                                                                          0.0s
Attaching to my_mysql-init-1, my_mysql-main-1
my_mysql-init-1  |
my_mysql-init-1  | ██╗  ██╗███████╗███╗   ███╗     ██████╗██╗     ██╗
my_mysql-init-1  | ██║ ██╔╝██╔════╝████╗ ████║    ██╔════╝██║     ██║
my_mysql-init-1  | █████╔╝ ███████╗██╔████╔██║    ██║     ██║     ██║
my_mysql-init-1  | ██╔═██╗ ╚════██║██║╚██╔╝██║    ██║     ██║     ██║
my_mysql-init-1  | ██║  ██╗███████║██║ ╚═╝ ██║    ╚██████╗███████╗██║
my_mysql-init-1  | ╚═╝  ╚═╝╚══════╝╚═╝     ╚═╝     ╚═════╝╚══════╝╚═╝
my_mysql-init-1  |
my_mysql-init-1  | Current Version: 1.0.14
my_mysql-init-1  |
my_mysql-init-1  | Running in shell mode. Type 'quit' to exit.
my_mysql-init-1  |
my_mysql-init-1 exited with code 0
my_mysql-main-1  | 2022-10-31 21:35:26+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
my_mysql-main-1  | 2022-10-31 21:35:26+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
my_mysql-main-1  | 2022-10-31 21:35:26+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
my_mysql-main-1  | 2022-10-31 21:35:26+00:00 [Note] [Entrypoint]: Initializing database files
my_mysql-main-1  | 2022-10-31T21:35:26.830527Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
my_mysql-main-1  | 2022-10-31T21:35:26.830594Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.31) initializing of server in progress as process 83
...
my_mysql-main-1  | 2022-10-31T21:35:35.611063Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
my_mysql-main-1  | 2022-10-31T21:35:35.611015Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
```

## Dockerランタイムの例に貢献

良い例がございましたら、Slackでご連絡いただくか、<sm@keepersecurity.com> までメールでお送りください。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.keeper.io/keeperpam/jp/secrets-manager/integrations/docker-runtime.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
