web-dev-qa-db-ja.com

Jenkins DockerコンテナーでDockerボリュームをマウントする方法?

私はジェンキンスをコンテナ内で実行していて、githubのソースコードをプロジェクトしています。

Jenkinsと同じホスト上のコンテナーでプロジェクトを実行する必要がありますが、docker-in-dockerではなく、兄弟コンテナーとして実行したいと思います。

私のパイプラインは次のようになります:

  1. githubからソースをプルする
  2. プロジェクトイメージをビルドする
  3. プロジェクトコンテナを実行する

私が今やっていることは、jenkinsコンテナからホストのDockerソケットを使用しています:

/var/run/docker.sock:/var/run/docker.sock

Jenkinsコンテナーが/ var/jenkins_home/workspace/BRANCH_NAMEからプロジェクトコンテナーにソースコードを含むボリュームをマウントするときに問題が発生します。

volumes:
 - ./servers/identity/app:/srv/app

プロジェクトコンテナーに空のフォルダー「/ srv/app」を取得しています

私の推測では、dockerはjenkinsコンテナーからではなく、ホストからマウントしようとしていると考えられます。

だから問題は、ボリュームをマウントするコンテナを明示的に設定するにはどうすればよいですか?

14
Zhorzh Alexandr

Jenkins Dockerコンテナーを使用して別のコンテナーを実行すると、同じ問題が発生しました。

Senario 1-Jenkins Dockerコンテナー内のコンテナーの実行

これは推奨される方法ではありません。ここでは explanations を使用します。それでもこのアプローチを使用する必要がある場合、この問題は問題ではありません。

Senario 2-Jenkinsコンテナー内でのdockerクライアントの実行

Jenkins Dockerコンテナー内で別のコンテナー( ContainerA )を実行する必要があるとします。dockerパイプラインプラグイン--volumes-fromを使用して Jenkinsコンテナボリューム ContainerA にマウントします。

--volumeまたは-vを使用して Jenkinsコンテナの特定のディレクトリを ContainerA にマッピングしようとすると、予期しない動作が発生しました。

これは、--volumesまたは-v Host のディレクトリを ContainerA にマッピングしようとするため、ディレクトリからマッピングするのではないためです。 Jenkinsコンテナの中。 Host にディレクトリが見つからない場合、 ContainerA 内に空のディレクトリが取得されます。

つまり、containerAからc​​ontainerBに特定のディレクトリをマップすることはできません。containerAからc​​ontainerBにボリューム全体をマウントすることしかできません ボリュームエイリアスはサポートされていません

解決

  1. Jenkinsがホストボリュームで実行されている場合は、ホストディレクトリをターゲットコンテナーにマップできます。
  2. それ以外の場合は、新しく作成されたコンテナ内の Jenkinsコンテナと同じ場所にあるファイルにアクセスできます。
5
Enix

「/ var/jenkins_home」はJenkinsコンテナのボリュームである可能性が最も高いため、ホストとJenkinsの間で靴下を共有することが私の問題でした。

私のソリューションは、sockを共有せずにsystemdコンテナー内にdockerをインストールすることでした。

docker run -d --name jenkins \
    --restart=unless-stopped \
    --privileged \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    -v jenkins-vol:/var/lib/jenkins \
    --tmpfs /run \
    --tmpfs /run/lock \
    ubuntu:16.04 /sbin/init

次に、Jenkins、Docker、Docker Composeをインストールします。

2
hasusuf

試してください:

docker run -d --volumes-from <ContainerID> <YourImage>

ここで、コンテナーIDは、モンデータを取得するコンテナーのIDです。

次の方法でボリュームを作成することもできます。

docker volume create <volname>

両方のコンテナに割り当てます

volumes:
 - <volname>:/srv/app
2
itiic