Skip Navigation
Show nav
Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up
Hide categories

Categories

  • Heroku のアーキテクチャ
    • コンピューティング (dyno)
      • dyno の管理
      • dyno の概念
      • dyno の動作
      • dyno の参照資料
      • dyno のトラブルシューティング
    • スタック (オペレーティングシステムイメージ)
    • ネットワーキングと DNS
    • プラットフォームポリシー
    • プラットフォームの原則
  • 開発者ツール
    • コマンドライン
    • Heroku の VS Code 拡張機能
  • デプロイ
    • Git を使用したデプロイ
    • Docker によるデプロイ
    • デプロイ統合
  • 継続的デリバリーとインテグレーション
    • 継続的統合
  • 言語サポート
    • Node.js
      • Node.js アプリのトラブルシューティング
      • Heroku での Node.js の動作
      • Node.js の操作
    • Ruby
      • Rails のサポート
      • Bundler の使用
      • Ruby の操作
      • Heroku での Ruby の動作
      • Ruby アプリのトラブルシューティング
    • Python
      • Python の操作
      • Python でのバックグラウンドジョブ
      • Heroku での Python の動作
      • Django の使用
    • Java
      • Heroku での Java の動作
      • Java の操作
      • Maven の使用
      • Spring Boot の使用
      • Java アプリのトラブルシューティング
    • PHP
      • PHP の操作
      • Heroku での PHP の動作
    • Go
      • Go の依存関係管理
    • Scala
    • Clojure
    • .NET
      • Working with .NET
  • データベースとデータ管理
    • Heroku Postgres
      • Postgres の基礎
      • Postgres スターターガイド
      • Postgres のパフォーマンス
      • Postgres のデータ転送と保持
      • Postgres の可用性
      • Postgres の特別なトピック
      • Heroku Postgres への移行
    • Heroku Key-Value Store
    • Apache Kafka on Heroku
    • その他のデータストア
  • AI
    • Vector Database
    • Working with AI
    • Heroku Inference
      • AI Models
      • Inference Essentials
      • Heroku Inference Quick Start Guides
      • Inference API
    • Model Context Protocol
  • モニタリングとメトリクス
    • ログ記録
  • アプリのパフォーマンス
  • アドオン
    • すべてのアドオン
  • 共同作業
  • セキュリティ
    • アプリのセキュリティ
    • ID と認証
      • シングルサインオン (SSO)
    • Private Space
      • インフラストラクチャネットワーキング
    • コンプライアンス
  • Heroku Enterprise
    • Enterprise Accounts
    • Enterprise Team
    • Heroku Connect (Salesforce 同期)
      • Heroku Connect の管理
      • Heroku Connect のリファレンス
      • Heroku Connect のトラブルシューティング
  • パターンとベストプラクティス
  • Heroku の拡張
    • Platform API
    • アプリの Webhook
    • Heroku Labs
    • アドオンのビルド
      • アドオン開発のタスク
      • アドオン API
      • アドオンのガイドラインと要件
    • CLI プラグインのビルド
    • 開発ビルドパック
    • Dev Center
  • アカウントと請求
  • トラブルシューティングとサポート
  • Salesforce とのインテグレーション
  • デプロイ
  • Docker によるデプロイ
  • Container Registry および Runtime (Docker デプロイ)

Container Registry および Runtime (Docker デプロイ)

日本語 — Switch to English

最終更新日 2024年12月03日(火)

Table of Contents

  • はじめに
  • レジストリへのログイン
  • イメージのビルドとプッシュ
  • イメージのリリース
  • One-off dyno
  • CI/CD プラットフォームの使用
  • Release Phase
  • Dockerfile コマンドとランタイム
  • ローカルでのイメージのテスト

Heroku Container Registry を使用すると、Docker イメージを Heroku にデプロイできます。Common Runtime​ と Private Space​ の両方がサポートされています。

Heroku で Docker イメージをビルドさせる場合は、レビューアプリを活用するだけでなく、heroku.yml で Docker イメージのビルド​を確認します。

Heroku container​ スタック​は、高度なユースケースのみを想定しています。カスタム Docker イメージが特に必要な場合を除き、 Heroku のデフォルト buildpack​ を利用したビルドシステムを代わりに使用することをお勧めします。これにより、 ベースイメージの自動セキュリティ更新、言語固有の最適化が提供され、Dockerfile​ を保守する必要がなくなります。

 

この記事は、Cedar​ 世代のアプリにのみ適用されます。

はじめに

作業用 Docker インストールがあることを確認し (docker ps​ など)、Heroku にログインしていることを確認します (heroku login​)。

Container Registry にログインします。

$ heroku container:login

Alpine ベースの python 例を複製することによりサンプルコードを取得します。

$ git clone https://github.com/heroku/alpinehelloworld.git

アプリのディレクトリに移動して、Heroku アプリを作成します。

$ cd alpinehelloworld
$ heroku create --stack container
Creating salty-fortress-4191... done, stack is container
https://salty-fortress-4191.herokuapp.com/ | https://git.heroku.com/salty-fortress-4191.git

イメージをビルドし、Container Registry にプッシュします。

$ heroku container:push web

続いてイメージをアプリにリリースします。

$ heroku container:release web

次に、アプリをブラウザで開きます。

$ heroku open

レジストリへのログイン

Heroku は、registry.heroku.com​ でコンテナレジストリを実行します。

Heroku CLI を使用している場合、次のように指定してログインできます。

$ heroku container:login

または直接 Docker CLI を使用します。

$ docker login --username=_ --password=$(heroku auth:token) registry.heroku.com

イメージのビルドとプッシュ

アプリのスタックが heroku stack:set container​ 経由で container​ に設定されていることを確認します。

イメージのビルドとプッシュ

イメージをビルドして Container Registry にプッシュするには、ディレクトリに Dockerfile が含まれていることを確認し、次のように実行します。

$ heroku container:push <process-type>

既存のイメージのプッシュ

Docker Hub からプルしたものなどのイメージを Heroku にプッシュするには、次の命名テンプレートに従って、そのイメージにタグを付けプッシュします。

$ docker tag <image> registry.heroku.com/<app>/<process-type>
$ docker push registry.heroku.com/<app>/<process-type>

タグでプロセスタイプを指定することにより、CLI を使用してイメージをリリース​できます。タグでプロセスタイプを指定しない場合は、image_id​ を使用する API を介してリリース​する必要があります。

複数のイメージのプッシュ

複数のイメージをプッシュするには、Dockerfile.<process-type>​ を使用して Dockerfile の名前を変更します。

$ ls -R

./webapp:
Dockerfile.web

./worker:
Dockerfile.worker

./image-processor:
Dockerfile.image

次に、プロジェクトのルートディレクトリから、次のように実行します。

$ heroku container:push --recursive
=== Building web
=== Building worker
=== Building image
=== Pushing web
=== Pushing worker
=== Pushing image

これは、3 つのイメージすべてをビルドしてプッシュします。特定のイメージだけをプッシュする場合は、プロセスタイプを指定できます。

$ heroku container:push web worker --recursive
=== Building web
=== Building worker
=== Pushing web
=== Pushing worker

イメージのリリース

CLI

Container Registry に正常にイメージをプッシュした後、次のコマンドを使用して新しいリリースを作成できます。

$ heroku container:release web

複数のイメージがある場合は、それらを一覧表示します。

$ heroku container:release web worker

複数のプロセスタイプを持つアプリでは、1 つのプロセスタイプ (heroku container:release web​ など) だけをリリースする場合、すべてのプロセスタイプが再起動されます。

API

curl --netrc -X PATCH https://api.heroku.com/apps/$APP_ID_OR_NAME/formation \
  -d '{
  "updates": [
    {
      "type": "web",
      "docker_image": "$WEB_DOCKER_IMAGE_ID"
    },
    {
      "type": "worker",
      "docker_image": "$WORKER_DOCKER_IMAGE_ID"
    }
  ]
}' \
  -H "Content-Type: application/json" \
  -H "Accept: application/vnd.heroku+json; version=3.docker-releases"

curl --netrc​ オプションが機能するようにするには、heroku login​ を事前に実行して .netrc​ ファイルの API トークンを設定する必要があります。

Docker イメージ ID の取得

プラットフォーム API を介してイメージをリリースするときに使用される docker イメージの値は、algorithm:hex​ 形式である必要があります。次に例を示します。

sha256:4d2647aab0e8fbe92cb0fc88c500eb51661c5907f4f14e79efe8bfbda1f7d159

イメージのためにこの ID を取得するには、次のコマンドを実行します。

$ docker inspect my_image --format={{.Id}}
sha256:4d2647aab0e8fbe92cb0fc88c500eb51661c5907f4f14e79efe8bfbda1f7d159

One-off dyno

アプリが複数の Docker イメージから構成されている場合、One-off dyno を作成するときにプロセスタイプを対象にすることができます

$ heroku run bash --type=worker
Running bash on ⬢ multidockerfile... up, worker.5180
$

タイプが指定されていない場合、web​ イメージが使用されます。

CI/CD プラットフォームの使用

現在、Heroku CI を使用してコンテナビルドをテストすることはできません。

サードパーティ製の CI/CD プラットフォームを使用している場合は、レジストリにイメージをプッシュできます。最初に次の情報で認証します。

  • レジストリ URL: ​registry.heroku.com
  • ユーザー名: ​your Heroku email address
  • メール: ​your Heroku email address
  • パスワード: ​your Heroku API key

多くの CI/CD プロバイダーは、イメージをビルドして Docker レジストリにプッシュする方法に関するドキュメントを用意しています。

  • Bamboo
  • Codefresh
  • Codeship
  • CircleCI
  • Jenkins
  • Semaphore CI
  • TravisCI

Release Phase

Release Phase​ を使用するには、release​ という名前の Docker イメージをプッシュします。

$ heroku container:push release

Docker イメージをリリースすると、heroku container:release​ を実行することにより、Release Phase プロセスタイプを指定する必要があります。

$ heroku container:release web release
Releasing images web,release to your-app-name... done
Running release command...
Migrating database.

Release Phase が実行するときにストリーミングログを確認する場合は、Docker イメージに curl​ が必要です。Docker イメージに curl​ が含まれていない場合、アプリケーションログでのみ Release Phase ログを使用できます。

Dockerfile コマンドとランタイム

Docker イメージは、dyno において、slugs が行う方法と同じように​同じ制約のもと実行します。

  • Web プロセスは、Heroku により設定された $PORT​ 上で HTTP トラフィックをリスンする必要があります。Dockerfile​内の EXPOSE​ は考慮されませんが、ローカルテストに使用できます。HTTP リクエストだけがサポートされています。
  • dyno のネットワークリンクはサポートされていません。
  • ファイルシステムは一時的です。
  • 作業用ディレクトリは /​ です。WORKDIR​を使用して、別のディレクトリを設定できます。
  • 環境変数を設定するための ENV​ がサポートされています。
    • ランタイム変数 (GEM_PATH​ など) に ENV​ を、資格情報に heroku config​ を使用することをお勧めします。そうすれば、機密性のある資格情報が誤ってソースコード制御にチェックインされることがなくなります。
  • ENTRYPOINT​ はオプションです。設定されていない場合、/bin/sh -c​ が使用されます。
    • CMD​ は常にシェルにより実行されるので、環境設定​はプロセスで使用可能になります。単一のバイナリを実行したり、シェルなしでイメージを使用するには、ENTRYPOINT​ を使用してください。

コンテナは、Heroku のルート権限で実行されていない​ので、非ルートユーザーとしてローカルでイメージをテストすることを強くお勧めします。

未サポートの Dockerfile コマンド

  • VOLUME​ - ボリュームマウンティングはサポートされていません。dyno のファイルシステムは一時的です​。
  • EXPOSE​ - EXPOSE​ はローカルテストに使用できますが、Heroku のコンテナランタイムではサポートされていません。代わりに、Web プロセス/コードで $PORT 環境変数を取得します。
  • STOPSIGNAL​ - dyno マネージャーは、SIGTERM 信号​とそれに続く SIGKILL 信号を送信することにより、プロセスがグレースフルシャットダウンを行うように要求します。STOPSIGNAL​は考慮されません。
  • SHELL​ - Docker イメージのデフォルトのシェルは /bin/sh​ であり、必要に応じて ENTRYPOINT​ で上書きできます。
  • HEALTHCHECK​ - HEALTHCHECK​ は現在サポートされていませんが、Heroku Dyno マネージャーが自動的に、実行中のコンテナのヘルスを確認します。

ローカルでのイメージのテスト

​ ローカルでイメージをテストするときに、多数のベストプラクティスがあります。これらのベストプラクティスは、この [Dockerfile 例](https://github.com/heroku/alpinehelloworld/blob/master/Dockerfile) に実装されています。

非ルートユーザーとしてのイメージの実行

コンテナは、Heroku のルート権限で実行されていないので、非ルートユーザーとしてローカルでイメージをテストすることを強くお勧めします。`CMD`​の直前に、次のコマンドを Dockerfile に追加できます。 Alpine を使用している場合: “` RUN adduser -D myuser USER myuser ”` Ubuntu を使用している場合: “` RUN useradd -m myuser USER myuser ”` コンテナが非ルートユーザーとして実行していることを確認するには、実行中のコンテナにアタッチしてから、`whoami`​ コマンドを実行します。 “`term $ docker exec

関連カテゴリー

  • Docker によるデプロイ
heroku.yml を使用して Docker イメージをビルドする Docker Compose を使用したローカル開発

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2025 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices