「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Docker Compose でコマンドを 1 回だけ実行するにはどうすればよいですか?

Docker Compose でコマンドを 1 回だけ実行するにはどうすればよいですか?

2024 年 11 月 19 日に公開
ブラウズ:215

How to Run a Command Only Once in Docker Compose?

Docker Compose でコマンドを 1 回実行する

Docker Compose ファイルを使用する場合、特定のコマンドを 1 回だけ実行する必要がある場合があり、多くの場合、初期セットアップ中に実行されます。アプリケーションの。この要件は、アプリケーションが初期化が必要なデータベースに依存しており、初期化は最初の実行時にのみ行われる必要がある場合に発生します。

この場合、ユーザーはコマンド ./my-project - を実行する予定です。必要な情報をデータベースに追加するためのセットアップを行います。これを実現するには、コンテナにエントリポイント スクリプトを組み込むことをお勧めします。

エントリポイント スクリプト

エントリポイント スクリプトは、メイン アプリケーションを開始する前にカスタム コマンドを実行するメカニズムを提供します。エントリポイント スクリプト内で、データベースがすでに初期化されているかどうかを確認できます。初期化が必要な場合、スクリプトはセットアップ手順を実行できます。

このアプローチにより、コンテナーが再起動されたりサービスがスケールアップされた場合でも、初期化コマンドは 1 回だけ実行されます。

docker-compose.yml ファイル

このソリューションを実装するには、docker-compose.yml ファイルを変更して、my_project サービスに次のスクリプトを含めます。定義:

services:
  my_project:
    build: .
    volumes:
      - data:/app
    ports:
      - "6060:8080"
    depends_on:
      - mongo
    entrypoint: ["/app/entrypoint.sh"]

この場合、データはアプリケーション コードを含むボリュームで、entrypoint.sh はエントリポイント スクリプトです。

entrypoint.sh スクリプト

次の内容を含むentrypoint.shスクリプトを作成します:

#!/bin/bash

# Check if database is initialized.
mongo mongo://admin:admin@mongo:27017/my_project --eval "db.user.findOne()" > /dev/null 2>&1

# If the database is not initialized, perform setup.
if [ $? -ne 0 ]; then
  /app/my_project -setup
fi

# Start the application.
/app/my_project

このスクリプトでは、mongo は Mongo コンテナーのホスト名、my_project はデータベース名です。

このスクリプトは、特定のドキュメントが Mongo コンテナーのユーザー コレクションに存在するかどうかを確認します。データベース。ドキュメントが存在しない場合は、データベースが初期化されていないことを示し、setup コマンドが実行されます。それ以外の場合、アプリケーションは正常に起動します。

「データ専用コンテナ」の削除

ユーザーは最初、データベース ボリュームをマウントするために「データ専用コンテナ」を使用したことに注意してください。ただし、名前付きボリュームをサポートする Docker 1.9 以降では、このアプローチは必要なくなりました。したがって、mongodata コンテナーを docker-compose.yml ファイルから削除し、指定されたボリュームを直接使用するように mongo サービスを変更できます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3