GNU/Linux >> Linux の 問題 >  >> Linux

Docker 内の Docker はボリュームをマウントできません

Docker コンテナー内の Docker コンテナーは、親 HOST の Docker デーモンを使用するため、「docker-in-docker」の場合にマウントされたボリュームは、コンテナーからではなく、引き続き HOST から参照されます。

したがって、Jenkins コンテナからマウントされた実際のパスは、HOST には「存在しません」。これにより、空の「docker-in-docker」コンテナに新しいディレクトリが作成されます。ディレクトリがコンテナ内の新しい Docker コンテナにマウントされている場合も同じことが当てはまります。

非常に基本的で明白なことを見逃していましたが、質問を入力するとすぐに気付きました。


これを行う別の方法は、名前付きボリュームまたはデータ ボリューム コンテナーのいずれかを使用することです。このように、内部のコンテナーはホストについて何も知る必要がなく、Jenkins コンテナーとビルド コンテナーの両方が同じ方法でデータ ボリュームを参照します。

Jenkinsマスターを使用するのではなく、エージェントを使用することを除いて、あなたがしていることと同様のことを試みました。 Jenkinsワークスペースを内側のコンテナにマウントできなかったという点で問題は同じでした。私にとってうまくいったのは、データ ボリューム コンテナー アプローチを使用することで、ワークスペース ファイルはエージェント コンテナーと内部コンテナーの両方に表示されました。このアプローチで私が気に入ったのは、両方のコンテナーが同じ方法でデータ ボリュームを参照することです。内部コンテナを使用してディレクトリをマウントするのは、親コンテナが実行されているホストについて何かを知る必要があるため、注意が必要です。

ここに私のアプローチに関する詳細なブログ投稿があります:

http://damnhandy.com/2016/03/06/creating-containerized-build-environments-with-the-jenkins-pipeline-plugin-and-docker-well-almost/

コードはこちら:

https://github.com/damnhandy/jenkins-pipeline-docker

私の特定のケースでは、Jenkins Pipeline プラグインに関して、すべてが希望どおりに機能しているわけではありません。ただし、内部コンテナーが Jenkins ワークスペース ディレクトリにアクセスできるという問題は解決されています。


これらの投稿には多くの有益な情報が含まれていますが、どのコンテナについて言及しているのか明確にわかっているものはありません。それでは、3 つの環境にラベルを付けましょう:

  • ホスト:H
  • H:D で実行される docker コンテナ
  • D:D2 で実行されている Docker コンテナ

フォルダーを H から D にマウントする方法は誰もが知っています。D を

で開始します。
docker run ... -v <path-on-H>:<path-on-D> -v /var/run/docker.sock:/var/run/docker.sock ...

課題は次のとおりです:path-on-H が必要です D2 で path-on-D2 として利用可能 .

しかし、同じ path-on-H をマウントしようとしたとき、私たちは皆噛まれました

で D2 を開始したため、D2 に
docker run ... -v <path-on-D>:<path-on-D2> ...

H 上の docker ソケットを D と共有すると、D で docker コマンドを実行することは、基本的に H 上でそれらを実行することになります。

docker run ... -v <path-on-H>:<path-on-D2> ...

次のトリッキーなビットは、私たちの多くにとって path-on-H です。 誰が運営するかで変わります。 path-on-H に何を使用するかを認識できるように、データを D に渡す方法は多数あります。 、しかしおそらく最も簡単なのは環境変数です。このような var の目的を明確にするために、その名前を DIND_ で始めます。 .それから H から D を次のように開始します:

docker run ... -v <path-on-H>:<path-on-D> --env DIND_USER_HOME=$HOME \
    --env DIND_SOMETHING=blabla -v /var/run/docker.sock:/var/run/docker.sock ...

そして D から 次のように D2 を開始します:

docker run ... -v $DIND_USER_HOME:<path-on-D2> ...

Linux
  1. Dockerボリュームを理解する

  2. ホストディレクトリをDockerコンテナにマウントする方法

  3. Dockerコンテナを終了する方法

  1. 一部のDOCKERコマンド

  2. Dockerの概要

  3. Ubuntu で docker を実行中:マウントされたホスト ボリュームはコンテナーから書き込み可能ではありません

  1. Dockerコンテナに単一のファイルをマウントまたはシンボリックリンクする方法

  2. ホスト ポートを Docker コンテナに転送する

  3. Docker コンテナーでサービスを自動的に開始する