ホームページ  >  記事  >  バックエンド開発  >  Docker Compose でコマンドを 1 回だけ実行するにはどうすればよいですか?

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-09 13:25:02223ブラウズ

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"]

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

entrypoint.sh Script

Create次の内容の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 はデータベース名です。

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

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

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

以上がDocker Compose でコマンドを 1 回だけ実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。