web-dev-qa-db-ja.com

jenkins docker container MacOS内のdockerに接続できません

丸一日読んで試してみた後、他の回答から何もこの仕事をするのに役立たなかったので、私はこの仕事を作る方法を尋ねるためにここにこっそり来ました。

Macos 10.13.6(High Sierra)を使用しています

Docker Desktop for Mac 2.2.0.5の実行(43884)

Engine: 19.03.8
Compose 1.25.4

私はジェンキンスを実行してパイプラインに関する研究をしたいので、これは私の「docker-compose.yml」です

version: "3.2"

services:
  jenkins:

    build: 
      dockerfile: dockerfile
      context: ./build

    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/var/jenkins_home

最初の問題は、私が使用している画像がjenkins/jenkins:ltsにはDockerクライアントがインストールされていないため、ボリュームを介してソケットをマッピングしても、使用できませんdocker versionこのコマンドの出力はbash: docker: command not found

これはテスト用の私のパイプラインです(jenkinsのドキュメントから):

pipeline {
    agent { docker { image 'node:6.3' } }
    stages {
        stage('build') {
            steps {
                sh 'npm --version'
            }
        }
    }
}

したがって、このプラグインを通じてhttps://plugins.jenkins.io/docker-plugin/「Jenkinsの管理>ノードとクラウドの管理>クラウドの構成>新しいクラウドの追加」と「Dockerクラウドの詳細...」に移動できます

私は「unix:///var/run/docker.sock」を置くことができるホストURIを持っています。ホストのmacosからのdockerを使用して、ジェンキンが行う必要があることを実行します。

私はインターネットからすべての提案を試しました、jenkinsユーザー、dockerユーザーの作成、docker groupへのjenkinsユーザーの配置など、Macでは動作しません。

質問の大部分はLinuxに関するものであり、それらすべてが問題を解決したようですが、macosで複製しようとすると、うまくいきません。

多分私が見逃しているいくつかのステップがあるか、人々は彼らがいくつかのステップでやらなければならないことをすでに知っていますが、私は惨めに失敗しています。

私が試したステップのいくつか:

使用ユーザーとグループのジェンキンを作成します。

Sudo dscl . create /Users/jenkins UniqueID 1000 PrimaryGroupID 1000
Sudo dscl . create /Groups/jenkins gid 1000

グループドッカーを作成しました:

Sudo dscl . create /Groups/docker gid 1001

Jenkinsユーザーをdockerグループに追加しました

Sudo dscl . append /Groups/docker GroupMembership jenkins

ユーザーが本当にグループに参加しているかどうかを確認した

$ dsmemberutil checkmembership -u 1000 -g 1001
user is a member of the group

Jenkinsコンテナー内からソケットの所有者を変更しようとしました(そのため、イメージを構築していましたが、機能しませんでした)

ホストmacosのソケットの所有権をチェンジャーで変更しようとしましたが、変更されませんでした。ソケットは常にこれらのアクセス許可を持っています。

lrwxr-xr-x 1 root daemon 68B Apr 28 10:14 docker.sock -> /Users/metasix/Library/Containers/com.docker.docker/Data/docker.sock
6
Mateus Silva

作成ファイルにnetwork: Hostを追加して、ホストモードネットワークを有効にする必要があります。


services:
  jenkins:

    build: 
      dockerfile: dockerfile
      context: ./build
      network: Host

    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/var/jenkins_home

これにより、ゲストDockerコンテナーがホストネットワークを確認できるようになります。問題は、Docker Desktop for MacOSがTCPポートを介したリッスンをサポートしていないことです。socatを使用することによる既知の回避策があります。 https://www.ivankrizsan.se/ 2016/05/21/docker-api-over-http-on-mac-os-x-with-docker-for-mac-beta / 。docker.sockerからTCP 2376ホストURIをtcp://0.0.0.0:2376に設定します。そしてもちろん、jenkins/jenkins:ltsをFROM jenkins/jenkins:ltsで拡張して追加する新しいDockerfileを作成する必要があります。別の回答で提案されているコンテナへのDocker

1
Kevin Matthews

Jenkinsの場合、最善の方法は、すべてのジョブを実行するエージェントと、オーケストレーションジョブのみを実行するマスターを用意することです。

数年前、自分自身をjenkinsマスターに登録するJNLPエージェントを作成しました。私のリポジトリをここで確認できます。 https://github.com/jmaitrehenry/docker-jenkins-jnlp 言ったとおり、私は3年前のようにして、少し時代遅れかもしれません。

問題については、Docker for Macが小さなVM内でコンテナーを実行することを知っておく必要があるため、MacOSにユーザーを追加すると、VMにはそれがありません。Dockerfor MacはMac内のuidをコンテナ内のいくつかのuidにマップする魔法はたくさんあります。

Dockerfile内にdockerクライアントを追加してみてください。そのためには、次の手順を追加してみてください。

FROM jenkins/jenkins:lts
[...]

# Switch to root as the base image switch to jenkins user
USER root

# Download docker-cli and install it
RUN curl -o docker-ce-cli.deb https://download.docker.com/linux/debian/dists/stretch/pool/stable/AMD64/docker-ce-cli_19.03.8~3-0~debian-stretch_AMD64.deb && \
    dpkg -i docker-ce-cli.deb && \
    rm docker-ce-cli.deb

# Switch back to jenkins user
USER jenkins
1
jmaitrehenry