Docker Compose ファイルを使用する場合、特定のコマンドを 1 回だけ実行する必要がある場合があり、多くの場合、初期セットアップ中に実行されます。アプリケーションの。この要件は、アプリケーションが初期化が必要なデータベースに依存している場合に発生し、初期化は最初の実行時にのみ実行される必要があります。
この場合、ユーザーはコマンド ./my-project - を実行する予定です。必要な情報をデータベースに追加するためのセットアップを行います。これを実現するには、コンテナにエントリポイント スクリプトを組み込むことをお勧めします。
エントリポイント スクリプトは、メイン アプリケーションを開始する前にカスタム コマンドを実行するメカニズムを提供します。エントリポイント スクリプト内で、データベースがすでに初期化されているかどうかを確認できます。初期化が必要な場合、スクリプトはセットアップ手順を実行できます。
このアプローチにより、コンテナーが再起動されたりサービスがスケールアップされた場合でも、初期化コマンドは 1 回だけ実行されます。
このソリューションを実装するには、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 はエントリポイント スクリプトです。
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 サイトの他の関連記事を参照してください。