# Dockerイメージ

## Dockerでのシークレット管理

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2FxH1ulsuk1ZXPoGBQFWwu%2Fimage.png?alt=media&#x26;token=ebf1e4f3-1974-410b-b72f-d1fff80e3e3a" alt=""><figcaption></figcaption></figure>

## 機能

* KeeperボルトのシークレットのクレデンシャルをDockerイメージに渡します
* ビルド引数を指定し、Keeperボルトのシークレットのクレデンシャルを使用して、Dockerイメージをビルドします
* KeeperボルトからDockerコンテナにファイルをコピーします

{% hint style="info" %}
Keeper Secrets Manager機能の完全なリストについては、[概要](/jp/keeperpam/secrets-manager/overview.md)をご参照ください。
{% endhint %}

## 前提条件

このページでは、Secrets ManagerとDockerイメージのビルドアクションとの連携について説明します。 この連携を利用するための必要条件は以下のとおりです。

* Keeper Secrets Managerへのアクセス（詳細は、[クイックスタートガイド](/jp/keeperpam/secrets-manager/quick-start-guide.md)をご参照ください）
  * KeeperアカウントのSecrets Managerアドオンの有効化
  * Secrets Manager強制ポリシーが有効化されたロールを割り当てられたメンバーシップ
* シークレットを共有するKeeper [Secrets Managerアプリケーション](/jp/keeperpam/secrets-manager/about/terminology.md)
  * アプリケーションの作成手順については、[クイックスタートガイド](/jp/keeperpam/secrets-manager/quick-start-guide.md)をご参照ください
* [ワンタイムアクセストークン](/jp/keeperpam/secrets-manager/about/one-time-token.md)
* [Keeper Secrets Manager（KSM）CLIツール](/jp/keeperpam/secrets-manager/secrets-manager-command-line-interface.md)
  * KSM CLIの設定手順については、[こちら](/jp/keeperpam/secrets-manager/secrets-manager-command-line-interface.md)をご参照ください

## 概説

Secrets Manager CLIは、実行時にDockerイメージからシークレットを取得するために使用することも、Dockerイメージに組み込んで使用することもできます。このドキュメントでは、いくつかのユースケースについて説明します。

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

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

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

```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`でパスワードを設定します。このDockerファイルは以下のとおりです。

```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表記法を使用して、環境変数を設定します。表記法の詳細は、[こちら](/jp/keeperpam/secrets-manager/about/keeper-notation.md)をご参照ください。

```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`でパスワードを設定します。このDockerファイルは以下のとおりです。

```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`でパスワードを設定します。このDockerファイルは以下のとおりです。

```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 Secretの記録を作成**

以下に示すように、Keeperボルト&#x3067;**`server.xml`**&#x3068;**`localhost-rsa.jks`**&#x306E;2つのファイル添付を含むシークレットの記録を作成します。

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2FxJXDAUQ8v1xqXvWUFaWl%2Fimage.png?alt=media&#x26;token=b8be5c41-d9ff-4719-88f3-ee42bf07e820" alt=""><figcaption><p>シークレットファイルを添付した記録の作成</p></figcaption></figure>

情報ダイアログに表示された、dockerfileで使用するUID記録をメモします。UID記録（Record UID）をクリックして、クリップボードにコピーします。

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2FpO7rDucMsSXjbGaFBSh2%2Fimage.png?alt=media&#x26;token=6893aa4a-fa6b-487e-8d53-a5cc0ba26ae4" alt=""><figcaption><p>UID記録をコピー</p></figcaption></figure>

**手順 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を実行するには、以下のスクリプトでSecrets Managerのデバイス設定と、シークレットファイルを含む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 Secrets Managerは、KSM Writer Dockerイメージを使用したDocker Composeとの直接連携をサポートしています。

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

## Dockerイメージの例に貢献

このページに貢献できる素晴らしい例をお持ちであれば、Slackでメッセージを送信するか、またはメールでお知らせください<sm@keepersecurity.com>。


---

# Agent Instructions: 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/jp/keeperpam/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.
