> For the complete documentation index, see [llms.txt](https://stablebuild.gitbook.io/ja/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stablebuild.gitbook.io/ja/pinning-your-first-container.md).

# はじめてのコンテナのピン留め

[なぜ StableBuild？](/ja/why-stablebuild.md) では典型的な Dockerfile を取り上げ、不安定なサービスやリポジトリへの依存がいかにビルドを突然壊す可能性があるかを説明しました。復習として、その Dockerfile を再掲します：

```docker
# このDockerfileをUbuntu 20.04ベースにする
FROM ubuntu:20.04
​
# パッケージインストール時にプロンプトを表示しない
ARG DEBIAN_FRONTEND=noninteractive
​
# OSレベルのパッケージをインストール
RUN apt update && apt install -y curl software-properties-common
​
# 新しいPythonバージョンが必要なため、Deadsnakes PPAから取得
RUN add-apt-repository -y ppa:deadsnakes/ppa && \
    apt update && \
    apt install -y python3.9 python3.9-distutils
​
# pip（Pythonパッケージマネージャー）をインストール
RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
    python3.9 get-pip.py
​
# pipを通じてPythonパッケージをインストール
RUN pip3 install onnx==1.14.0
```

StableBuild を使って、このコンテナを再現可能で安定したものにしましょう！

### StableBuild へのサインアップ

まず、<https://dashboard.stablebuild.com> にアクセスしてサインアップしてください（無料のコミュニティプランが利用可能です）。サインアップ後、ダッシュボードが表示されます：

<figure><img src="/files/q8SA3kU3iTH5n3ytz971" alt=""><figcaption><p>StableBuild ダッシュボード</p></figcaption></figure>

ダッシュボードから、すべての StableBuild ミラーとリポジトリ、ユーザーおよびキー管理、請求情報にアクセスできます。

### ベースイメージのピン留め

Dockerfile の最初の行は次のとおりです：

```
FROM ubuntu:20.04
```

このベースイメージは、新しい Ubuntu 20.04 バージョンがリリースされるたびに Docker Hub で上書きされ、レジストリから削除される可能性もあります。これにより、再現性のないビルドや壊れたビルドが発生します。このイメージをピン留めするには、**ダッシュボード > Docker mirror** に移動してください。ここでは、Dockerfile の任意の `FROM` 呼び出しにプレフィックスとして付けられる、アカウント固有の Docker ミラーサーバーを確認できます。

<figure><img src="/files/GSFOwp17MFDTuCaxmgHW" alt=""><figcaption><p>アカウント固有の Docker ミラー</p></figcaption></figure>

より具体的なタグを使用することも強くお勧めします（利用可能な場合）。`ubuntu:20.04` は非常に頻繁に更新されますが、Ubuntu 20.04 の特定のスナップショットは Docker Hub の `focal-*` タグで公開されています。`ubuntu:20.04` ではなく、例えば `focal-20231128`（Ubuntu 20.04 の 2023-11-28 バージョン）にピン留めすることで、StableBuild のピン留め済みイメージを削除することなく、必要に応じてより新しい Ubuntu バージョンに移行できます。

したがって、Dockerfile を次のように変更してください：

```docker
FROM your-prefix.dockermirror.stablebuild.com/ubuntu:focal-20231128
```

コンテナを再ビルドしてください。コンテナが初めてビルドされる際、`ubuntu:focal-20231128` イメージを Docker Hub からフェッチし（ビルド対象のアーキテクチャだけでなく、すべてのアーキテクチャバージョンを含む）、自分専用の StableBuild キャッシュに保存します。これ以降、このイメージはイミュータブルになります。上流のイメージが更新または削除されても、常に同じベースイメージを取得できます。

一度プルするとダッシュボードが更新されます：

<figure><img src="/files/gCAnJfmHrEUE0l0Wcu8I" alt=""><figcaption><p>ベースイメージが StableBuild にキャッシュされました</p></figcaption></figure>

キャッシュからイメージを削除する必要がある場合（例：より新しい Ubuntu 20.04 イメージが必要な場合）は、「Cached tags」から実行できます。

### Ubuntu パッケージレジストリおよびその他の PPA からのパッケージのピン留め

次に、Dockerfile は次のように続きます：

<pre class="language-docker"><code class="lang-docker"># OSレベルのパッケージをインストール
<strong>RUN apt update &#x26;&#x26; apt install -y curl software-properties-common
</strong>
# 新しいPythonバージョンが必要なため、Deadsnakes PPAから取得
RUN add-apt-repository -y ppa:deadsnakes/ppa &#x26;&#x26; \
    apt update &#x26;&#x26; \
    apt install -y python3.9 python3.9-distutils
</code></pre>

ここでは Ubuntu パッケージレジストリと deadsnakes PPA からいくつかのパッケージをインストールしていますが、これらのパッケージ（バージョンも利用可否も）はいつでも変わる可能性があります。ピン留めするには **ダッシュボード > Ubuntu repository** に移動してください。そして：

1. `sb-apt.sh` をダウンロードします。これはリポジトリを設定するシェルスクリプトです（コンテナ内から実行します）。Dockerfile の隣に配置してください。
2. ピン留め日付を選択します。Ubuntu（および Debian と Alpine）パッケージレジストリ全体の完全な日次コピー（すべてのパッケージを含む）と多くの PPA を作成しているため、日付でピン留めします（コピーを作成した日付）。新しいコンテナを作成する場合は、デフォルト（最後のミラー日付）をそのまま使用してください。
3. 読み込むパッケージリポジトリを選択します。ここでは「Ubuntu」と「Deadsnakes (Python)」を選択します。\
   \
   \&#xNAN;*注：他の PPA を使用する必要がある場合は、メッセージをお送りください。StableBuild に追加します。*

<figure><img src="/files/jE5QvsbwfamWw0Bs1qX2" alt=""><figcaption><p>Ubuntu パッケージレジストリ（およびその他の PPA）からのパッケージのピン留め</p></figcaption></figure>

次に、ステップ 4 の指示に従って Dockerfile を更新します。Dockerfile は次のようになります：

```docker
# このDockerfileをUbuntu 20.04（2023-11-28版）ベースにする
FROM your-prefix.dockermirror.stablebuild.com/ubuntu:focal-20231128

ARG SB_API_KEY=your-prefix
ARG APT_PIN_DATE=2023-12-07T10:40:01Z

COPY ./sb-apt.sh /opt/sb-apt.sh
RUN bash /opt/sb-apt.sh load-apt-sources ubuntu deadsnakes

# OSレベルのパッケージをインストール
RUN apt update && apt install -y curl software-properties-common

# 新しいPythonバージョンが必要（Deadsnakes PPAを手動で追加する必要はなくなりました）
RUN apt update && apt install -y python3.9 python3.9-distutils
```

コンテナを再ビルドすると、パッケージが StableBuild のミラーからプルされるようになります。

<figure><img src="/files/xmA5dEF8hfpRbVIgMZJ5" alt=""><figcaption><p>パッケージが StableBuild のミラーからプルされています</p></figcaption></figure>

### インターネット上の任意のファイルのピン留め

次に、Dockerfile は次のように続きます：

```docker
# pip（Pythonパッケージマネージャー）をインストール
RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
    python3.9 get-pip.py
```

ここではインターネットからファイルをダウンロードしてインストールしています。任意の URL をピン留めするには **ダッシュボード > File mirror** に移動してください。

<figure><img src="/files/3kHYFmr2fRVTEZBuaHdx" alt=""><figcaption><p>StableBuild のファイルミラー</p></figcaption></figure>

ここでは、任意の URL の先頭に付けられるプレフィックスが確認できます。これによりファイルが自動的にキャッシュされ、イミュータブルになります。実行後、ファイルは「Cached files」に一覧表示され、以降のリクエストでは常に同じファイルが返されます：

<figure><img src="/files/rAiKqkjzzjlRmcRUE159" alt=""><figcaption><p>「my-first-tutorial」キャッシュキーのキャッシュ済みファイルを表示</p></figcaption></figure>

ほとんどのファイルはこれで十分です。しかし、実行時に他のファイルをダウンロードするスクリプトの場合、スクリプト内の URL を書き換えるか、HTTP プロキシを設定する必要があります。`get-pip.py` もこのケースに該当します。これは単なるブートストラップスクリプトであり、PyPI レジストリから実際の pip パッケージをダウンロードします。

幸い、get-pip には `-i` フラグで PyPI ミラーを指定する方法があります。StableBuild の [PyPI ミラー](/ja/mirtokyasshu/pypi-mirror.md) を使用して、実際にダウンロードされるパッケージをピン留めできます（後述の「Python パッケージのピン留め」を参照）。Dockerfile は次のようになります：

```docker
# このDockerfileをUbuntu 20.04（2023-11-28版）ベースにする
FROM your-prefix.dockermirror.stablebuild.com/ubuntu:focal-20231128

ARG SB_API_KEY=your-prefix
ARG APT_PIN_DATE=2023-12-07T10:40:01Z

COPY ./sb-apt.sh /opt/sb-apt.sh
RUN bash /opt/sb-apt.sh load-apt-sources ubuntu deadsnakes

# OSレベルのパッケージをインストール
RUN apt update && apt install -y curl software-properties-common

# 新しいPythonバージョンが必要（Deadsnakes PPAを手動で追加する必要はなくなりました）
RUN apt update && apt install -y python3.9 python3.9-distutils

# pip（Pythonパッケージマネージャー）をインストール：ファイルキャッシュからget-pip.pyをダウンロードし、
# PyPIミラーから実際のパッケージをインストール
RUN curl https://your-prefix.httpcache.stablebuild.com/my-first-tutorial/https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
    python3.9 get-pip.py -i https://your-prefix.pypimirror.stablebuild.com/2023-12-07/
```

### Python パッケージのピン留め

最後に、Dockerfile は次のように続きます：

```docker
# pipを通じてPythonパッケージをインストール
RUN pip3 install onnx==1.14.0
```

これで onnx パッケージが正確なバージョンにピン留めされているように見えますが、onnx 自体がピン留めされていない依存関係を持っています。パッケージとそのすべてのサブ依存関係を適切にピン留めするには、**ダッシュボード > Pypi mirror** に移動してください。

ピン留め日付を選択する必要があります。Ubuntu / Debian / PPA パッケージレジストリと同様に、完全な PyPI レジストリの日次ミラーを作成しています。これにより、特定の時点からの完全なパッケージリストをインストールできます。新しいコンテナの場合はデフォルトをそのまま使用してください。ただし、古いバージョンの PyPI ミラーは古い Python のサンプルを復活させるのに非常に役立ちます（[PyPI ミラー > 古い Python サンプルを動作させる](/ja/mirtokyasshu/pypi-mirror.md#getting-older-python-examples-working) を参照）。

<figure><img src="/files/n188IRKUOlwam79rV5bZ" alt=""><figcaption><p>StableBuild の PyPI ミラーを使用した Python パッケージのピン留め</p></figcaption></figure>

ピン留めするには、`pip3 install` の行を StableBuild のミラーを参照するように更新するだけです。Dockerfile は次のようになります：

```docker
# このDockerfileをUbuntu 20.04（2023-11-28版）ベースにする
FROM your-prefix.dockermirror.stablebuild.com/ubuntu:focal-20231128

ARG SB_API_KEY=your-prefix
ARG APT_PIN_DATE=2023-12-07T10:40:01Z

COPY ./sb-apt.sh /opt/sb-apt.sh
RUN bash /opt/sb-apt.sh load-apt-sources ubuntu deadsnakes

# OSレベルのパッケージをインストール
RUN apt update && apt install -y curl software-properties-common

# 新しいPythonバージョンが必要（Deadsnakes PPAを手動で追加する必要はなくなりました）
RUN apt update && apt install -y python3.9 python3.9-distutils

# pip（Pythonパッケージマネージャー）をインストール：ファイルキャッシュからget-pip.pyをダウンロードし、
# PyPIミラーから実際のパッケージをインストール
RUN curl https://your-prefix.httpcache.stablebuild.com/my-first-tutorial/https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
    python3.9 get-pip.py -i https://your-prefix.pypimirror.stablebuild.com/2023-12-07/

# pipを通じてPythonパッケージをインストール
RUN pip3 install \
    -i https://your-prefix.pypimirror.stablebuild.com/2023-12-07/ \
    install onnx==1.14.0
```

コンテナを再ビルドして完了です。このコンテナは完全にピン留めされており、常に同じ OS バージョン、パッケージリスト、Python 依存関係がインストールされます。🎉

### ヒントとコツ

#### トラフィックログ

StableBuild を通じてプルされるものはすべてトラフィック制限の対象となります（有料プランでは超過料金が発生します。クォータはダッシュボードでご確認ください）。現在の請求期間のトラフィック概要はダッシュボードに表示されますが、詳細なトラフィックログを確認するには **ダッシュボード > Billing > Raw usage logs** に移動してください。ここには、サービス、IP、使用した API キーを含むすべての生トラフィックログが一覧表示されます：

<figure><img src="/files/kK3WRBmqawiohpBDFDCs" alt=""><figcaption><p>StableBuild の生トラフィックログ</p></figcaption></figure>

#### キーを非公開にする

サービスへの URL（例：`https://your-prefix.pypimirror.stablebuild.com/2023-12-07/`）は StableBuild への認証に使用され、アカウントへの請求にも使用されます。この URL は非公開にして、公開リポジトリにコミットしないようにしてください。公開すると、誰でもあなたのアカウントを使って StableBuild からプルできてしまいます。トラフィックの急増が見られた場合は、生トラフィックログを確認してキーが漏洩していないかチェックしてください。キーは **ダッシュボード > Keys** からローテーションできます。

公開リポジトリを安定した再現可能なものにするために、スコープを制限したキー（例：特定のタグのプルのみを許可）の作成を検討しています。ご興味があれば <support@stablebuild.com> までメールをお送りください。
