3

私はthisのチュートリアルに従っており、ドッカークライアントを呼び出すシェルスクリプトの代わりにDocker Composeを使用してインフラストラクチャを起動しようとしています。 gitlab-postgreqlとgitlab-redisの前にgitlabコンテナが起動されていることを除いて、すべてうまく動作します。したがって、これらのサービスが既に実行されていることを期待して失敗します。Dockerで他のコンテナをコンテナ待ちにする方法

depends_on属性を使用しようとしましたが、問題は解決しませんでした。私が知る限り、他の容器がより早く始めるなら、それは助けにならない。私が調べた研究の後、Docker Composeはコンテナの作成順序を制御するためのすぐれたソリューションを提供しません。

これはどのようにすることができますか?私はそのような基本的な機能が実装されていないとは信じられません。 Dockerがそれ自身の巧みさに悩まされており、基本を忘れているようです。さて、何か狂ったサポートスクリプトを使わずにコンテナの作成順序を制御するにはどうすればいいですか(最初はすべてのスクリプト/ドッカークライアントを使うよりももっと複雑です)

ここにdocker-compose.yml asそれは、

version: '2' 
services: 

    gitlab-postgresql: 
    image: sameersbn/postgresql:9.4-3 
    volumes: 
     - /srv/docker/gitlab/postgresql:/var/lib/postgresql 
    environment: 
     - DB_NAME=gitlabhq_production 
     - DB_USER=gitlab 
     - DB_PASS=password 

    gitlab-redis: 
    image: sameersbn/redis:latest 
    volumes: 
     - /srv/docker/gitlab/redis:/var/lib/redis 
    depends_on: 
     - "gitlab-postgresql" 

    gitlab: 
    image: sameersbn/gitlab:7.14.3 
    volumes: 
     - /srv/docker/gitlab/gitlab:/home/git/data 
    ports: 
     - "2222:22" 
     - "8080:80" 
    environment: 
     - GITLAB_PORT=8080 
     - GITLAB_SSH_PORT=2222 
    depends_on: 
     - gitlab-postgresql 
     - gitlab-redis 

    registry: 
    image: registry:2 
    volumes: 
     - /srv/docker/registry/data:/var/lib/registry 
    ports: 
     - "5000:5000" 
    depends_on: 
     - "gitlab" 

    jenkins: 
    image: jenkins:1.609.3 
    volumes: 
     - /srv/docker/jenkins/home:/var/jenkins_home 
     - /var/run/docker.sock:/var/run/docker.sock 
     - /usr/bin/docker:/bin/docker 
     - /usr/lib/x86_64-linux-gnu/libapparmor.so.1.1.0:/lib/x86_64-linux-gnu/libapparmor.so.1 
    ports: 
     - "8081:8080" 
     - "50000:50000" 
    user: root 
    depends_on: 
     - "registry" 

答えて

7

gitlabコンテナはgitlab-postgreqlとgitlab-Redisの前に開始されますが、ドッキングウィンドウコンテナのステータスが "アップ" でなくなるまで待つdepends_onを使用している

ですが、今までにこのコンテナ内のサービスまたはプログラムは、「完了していない」または「実行中」または「上」などの状態になることがあります。

チェックControlling startup order in Compose私はそれがあなたが必要とするものだと思っています。

wait-for-itやdockerizeなどのツールを使用します。これらは小さなラッパー で、アプリケーションのイメージに含めることができ、 はTCP接続を受け入れるまで指定されたホストとポートをポーリングします。アプリケーションのイメージを想定 あなたがドッキングウィンドウ-compose.ymlにエントリポイントを設定することで、それをラップすることができ 、そのDockerfileでCMDが設定されています:

ですから、Postgresのポートの後に待っていますエントリポイントが必要になります利用可能となり、実行状態のpostgre。 postgreが使用不能になるまで、ドッキングウィンドウコンテナがブロックされます - ドッキングウィンドウ-作曲あなたは一例 entrypoint: ./wait-for-it.sh db:5432

のために必要とすると、スクリプトであなたはpostgreが実行されているかどうか秒ごとにチェックするには 。

ドキュメントのように:

until psql -h "$host" -U "postgres" -c '\l'; do 
    >&2 echo "Postgres is unavailable - sleeping" 
    sleep 1 
done 
+0

これはばかげた壊れたツールを学ぶために、これらのハッキングを学ぶ時間を無駄にするよりも、成熟した成熟を待っているほうがよいでしょう。とにかく答えてくれてありがとう、それは面白い冗談だった。 –

+1

@TuomasToivonenこの問題は、分散システムの分野では解決するのが簡単ではなく、アプリケーション層のチェックインを行うのが最善の方法であるとアドバイスしています。しかし、私はそれが作成によって提供されるべきであることに同意しますが、今この "回避策"は**ドッカードキュメント**による正式な提案です。とにかくこの機能の[このPULL REQUEST-374](https://github.com/docker/compose/issues/374)(2014年以降開かれています)。 – VladoDemcak

+1

優れた答え私はそれがドッカーの作成文書の一部であることを知らなかった。この質問は、さまざまな変数で何度も尋ねられます。このリンクは、この種の質問に答えるための作業を容易にします –

1

コンV2を使用している場合は、healthcheckdepends_onを使用することができます。1+(ただし3+がconditionhttps://github.com/peter-evans/docker-compose-healthcheck/issues/3を落としたように)

Example on GitHub

例、データベースコンテナに:データベースに依存

healthcheck: 
    test: ["CMD-SHELL", "pg_isready -U postgres"] 
    interval: 30s 
    timeout: 30s 
    retries: 3 

プロジェクト:

depends_on: 
    kong-database: 
    condition: service_healthy 
関連する問題