公式の gitlabドキュメント によると、ci
パイプライン内でdocker build
を有効にする1つの方法は、dind
サービス(gitlab-ci
サービス )。
ただし、Dockerエグゼキューターで実行されているciジョブでは常にそうであるため、docker:latest
イメージも必要です。
誰か説明できますか:
docker:dind
とdocker:latest
の画像の違いは何ですか?docker build
ciジョブですか? docker:latest
イメージ(内でジョブが実行される!)dockerデーモンを組み込みません(そしてdocker-compose
また)、必要なコマンドに必要なツールはどれですか(例:docker build
、docker Push
など)?私が間違っていない限り、質問は次のようになります。
DockerクライアントとDockerデーモンが同じDocker(有効な)コンテナに常駐できない理由
docker:dindとdocker:latestイメージの違いは何ですか?
docker:latest
には、Dockerデーモンへの接続、つまりdocker build
、docker run
などの実行に必要なすべてが含まれています。 。また、dockerデーモンも含まれていますが、エントリポイントとして起動されていません。docker:dind
はdocker:latest
に基づいて構築され、エントリポイントとしてdockerデーモンを起動します。そのため、それらのコンテンツはほとんど同じですが、エントリポイントを通じて、1つはクライアントとしてtcp://docker:2375
に接続するように構成され、もう1つはデーモンに使用されることを意図しています。
サービスとdockerイメージの両方が必要な理由[…]?
両方は必要ありません。最初のステップとしてdockerd
を開始し、その後、通常どおりdocker build
およびdocker run
コマンドを実行して、2つのいずれかを使用できます here ;明らかに、これはgitlabの元のアプローチ のある時点 でした。しかし、service: docker:dind
をセットアップしてdockerd
を設定するのではなく、before_script
を記述する方が簡単です。また、ベースイメージでdockerd
を適切に起動およびインストールする方法を理解する必要はありません(docker:latest
を使用していない場合)。
.gitlab-ci.yml
でサービスを宣言すると、ランナーが画像に/var/run/docker.sock
をマウントしていることがわかっている場合、docker-in-dockerを簡単に交換できます。 protected variableDOCKER_Host
をunix:///var/run/docker.sock
に設定して、ビルドを高速化できます。そのようなランナーにアクセスできない他のユーザーは、.gitlab-ci.yml
を変更せずに、リポジトリをフォークしてdind
サービスにフォールバックできます。