> 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-image.md).

# Dockerイメージ

## Dockerシークレット管理

![](/files/DZm4f1SmRnX4A6I0FuQO)

## 機能

* Keeperボルトのシークレット認証情報をDockerイメージへ渡す
* ビルド引数を使用し、Keeperボルトのシークレット認証情報でDockerイメージをビルド
* KeeperボルトからDockerコンテナへファイルをコピー

{% 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)をご参照ください

## 概説

シークレットマネージャーCLIは、Dockerイメージの実行時やビルド時にシークレットを利用できます。本ページでは、いくつかのユースケースを取り扱います。

## 例 1: BuildKitを使用したシークレットを含むイメージのビルド

Keeperボルトのシークレットは、[Docker BuildKit](https://docs.docker.com/develop/develop-images/build_enhancements/)を使ってDockerコンテナに組み込めます。Docker 18.09以降では、マウントされたファイルシステム経由でシークレットを渡せます。ここでは、Keeperシークレットマネージャーから取得したユーザー名とパスワードで、ビルド先イメージにユーザーアカウントを作成する簡単な例を示します。

**手順 1:** 必要なシークレットにKeeper表記法を使用して環境変数を設定します。表記法の例については、[こちら](/keeperpam/jp/secrets-manager/secrets-manager-command-line-interface/exec-command.md#notation)をご参照ください。

```bash
export MY_UID="SOAsfj_lIg0VenDr83gjDw"
export MY_USER="keeper://${MY_UID}/field/login"
export MY_PASS="keeper://${MY_UID}/field/password"
```

**手順 2:** `ksm exec` コマンドで、2つのシークレット（ログインとパスワード）を用いたDockerビルドを実行します。`--secret` パラメータは、Keeperシークレットで置き換えられた環境変数から値を取得します。

```bash
DOCKER_BUILDKIT=1 ksm exec -- \
    docker build \
    --secret id=my_user,env=MY_USER \
    --secret id=my_password,env=MY_PASS \
   -t my_image .
```

**手順 3:** Dockerfileでは、`useradd` を使用してLinuxユーザーアカウントを作成し、`chpasswd` でパスワードを設定します。Dockerfileは以下のとおりです。

```bash
FROM my_base_image

RUN --mount=type=secret,id=my_user,dst=/my_secrets/my_user \
    --mount=type=secret,id=my_password,dst=/my_secrets/my_password \
      useradd "$(cat /my_secrets/my_user)" && \
      echo "$(cat /my_secrets/my_user)":"$(cat /my_secrets/my_password)" | chpasswd
```

この例では、各シークレットはファイルとしてマウントされます。**dst**値でシークレットを一時的に格納したい場所を指定します。RUNコマンドが終了すると、一時ファイルは削除され、アンマウントされます。ファイル名を引数として渡すか、この例では `cat $(/path/to/secret)` を使用してファイルの内容を変数に読み込みます。

## 例 2: ビルド引数を使用したシークレットを含むイメージのビルド

例1と同様に、`--build-arg` を使用してシークレットを渡すことができます。この例では、Dockerのビルドプロセスでシークレットを使用する機能も示します。

**手順 1:** 必要なシークレットにKeeper表記法を使用して環境変数を設定します。表記法の例については、[こちら](/keeperpam/jp/secrets-manager/secrets-manager-command-line-interface/exec-command.md#notation)をご参照ください。

```bash
export MY_UID="SOAsfj_lIg0VenDr83gjDw"
export MY_USER="keeper://${MY_UID}/field/login"
export MY_PASS="keeper://${MY_UID}/field/password"
```

**手順 2:** `ksm exec` コマンドで、2つのシークレット（ログインとパスワード）を用いたDockerビルドを実行します。`--inline` フラグでシークレットの置換を行います。以下に例を示します。

```
ksm exec --inline -- \
   docker build \
     --build-arg "BUILD_MY_USER=${MY_USER}" \
     --build-arg "BUILD_MY_PASSWORD=${MY_PASSWORD}" \
     -t my_image .
```

**手順 3:** Dockerfileでは、`useradd` を使用してLinuxユーザーアカウントを作成し、`chpasswd` でパスワードを設定します。Dockerfileは以下のとおりです。

```bash
FROM my_base_image
​ARG BUILD_MY_USER
ARG BUILD_MY_PASSWORD
 
RUN useradd "$(printenv --null BUILD_MY_USER)" && \
  echo "$(printenv --null BUILD_MY_USER)":"$(printenv --null BUILD_MY_PASSWORD)" | chpasswd
```

​`printenv` コマンドでシークレットが標準出力に送信されないようにするには、`--null` オプションを使用して改行を削除します。

## 例 3: docker-composeを使用したシークレットを含むイメージのビルド

この例では、docker-composeを使用してイメージをビルドします。docker-composeは環境変数からビルド引数を読み込めません。表記をシークレット値に置き換えるには、コマンドラインでビルド引数を設定する必要があります。表記をコマンドラインで使用するため、`--inline` 置換フラグを設定する必要があります。

**手順 1:** 単純な `docker-compose.yaml` ファイルを作成します。

```yaml
---
version: "3"
services:
  my_app:
    build:
      content: "."
```

**手順 2:** `ksm exec` コマンドで、2つのシークレット（ログインとパスワード）を用いたDockerビルドを実行します。`--inline` フラグでシークレットの置換を行います。以下に例を示します。

```
ksm exec --inline -- \
   docker-compose build \
     --build-arg "BUILD_MY_USER=${MY_USER}" \
     --build-arg "BUILD_MY_PASSWORD=${MY_PASSWORD}" \
     -t my_image .
```

**手順 3:** Dockerfileでは、`useradd` を使用してLinuxユーザーアカウントを作成し、`chpasswd` でパスワードを設定します。Dockerfileは以下のとおりです。

```bash
FROM my_base_image
​ARG BUILD_MY_USER
ARG BUILD_MY_PASSWORD
 
RUN useradd "$(printenv --null BUILD_MY_USER)" && \
  echo "$(printenv --null BUILD_MY_USER)":"$(printenv --null BUILD_MY_PASSWORD)" | chpasswd
```

​`printenv` コマンドでシークレットが標準出力に送信されないようにするには、`--null` オプションを使用して改行を削除します。

## 例 4: ボルトからDockerイメージにファイルをコピー

この実際の例では、SSL証明書とパスフレーズをKeeperボルトからTomcatコンテナにコピーします。

デフォルトでは、公式のTomcat dockerには、SSLが有効になっていないデフォルトのサーバー設定が含まれています。server.xmlをインストールし、キーストアファイルをコピーして、SSLを有効にするカスタムイメージをビルドします。server.xmlファイルには、キーストアファイルのシークレットのパスフレーズも含まれています。

**手順 1:** Keeperボルトにシークレットレコードを作成

Keeperボルトで、**`server.xml`** と **`localhost-rsa.jks`** の2つのファイル添付を含むシークレットレコードを作成します。

![シークレットファイルを添付したレコードの作成](/files/XZ1zpxHmTkdQW0QZ5NBS)

情報ダイアログに表示されるレコードUIDを控え、Dockerfileで使用します。レコードUIDをクリックしてクリップボードにコピーできます。

![レコードUIDをコピー](/files/RJkreRI1vjBEvJPvhePj)

**手順 2:** Dockerfileを作成

以下のDockerfileの例では、**server.xml**ファイルと**keystore**ファイルをボルトからTomcatフォルダにコピーします。

```bash
FROM tomcat:10-jdk16
​
ARG BUILD_KSM_INI_CONFIG
ARG BUILD_KSM_SERVER_UID
    
# シークレットレコードのファイル名
ARG BUILD_SERVER_CONFIG="server.xml"
ARG BUILD_KEYSTORE="localhost-rsa.jks"
  
# Python 3を一時的にインストール
RUN apt-get update -y && \
    apt-get install -y \
    python3 \
    python3-pip \
    python3-venv
​
# モジュールは後で削除できるように、既知の場所にインストール
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
RUN pip3 install keeper_secrets_manager_cli
​
RUN echo ${BUILD_KSM_INI_CONFIG}
​
# KSMクライアントデバイスの設定をインポートしてデコードし、ksmが検出可能な場所に保存
RUN ksm profile import $(printenv --null BUILD_KSM_INI_CONFIG)
​
# server.xmlとキーストアをTomcatのconfディレクトリにダウンロード
RUN ksm secret download -u ${BUILD_KSM_SERVER_UID} --name ${BUILD_SERVER_CONFIG} --file-output /usr/local/tomcat/conf/server.xml
RUN ksm secret download -u ${BUILD_KSM_SERVER_UID} --name ${BUILD_KEYSTORE} --file-output /usr/local/tomcat/conf/localhost-rsa.jks
​
# ksmはもう不要。ksm、python、Debian aptを削除して、Dockerイメージを小さく
RUN rm -rf /venv keeper.ini
RUN apt-get purge -y \
    python3 \
    python3-pip \
    python3-venv && \
    apt-get clean autoclean && \
    apt-get autoremove -y && \
    rm -rf /var/lib/{apt,dpkg,cache,log}/
​
# SSL用にポート8443を公開
EXPOSE 8443
```

この事例では、`ksm` はビルド後に不要になるため、削除します。

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

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

```bash
#!/bin/sh

# KSMプロファイルを文字列としてエクスポート
export CF=$(ksm profile export _default)

# docker buildを実行し、
# シークレットファイルを含むレコードUIDを渡す
docker build \
  --build-arg "BUILD_KSM_INI_CONFIG=${CF}" \
  --build-arg "BUILD_KSM_SERVER_UID=LdRkidFLPF7vDaogwJ7etQ" \
  -t ksm_tomcat .
```

Dockerイメージがビルドされると、Keeperボルトが管理するSSL、キーストアファイル、パスフレーズが完全に設定されます。

## Docker Composeとの連携

Keeperシークレットマネージャーは、KSM Writer Dockerイメージを使ったDocker Composeとの直接連携に対応しています。

KSM Writer Dockerイメージの詳細は、[こちら](/keeperpam/jp/secrets-manager/integrations/docker-writer-image.md)をご参照ください。

## 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-image.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.
