私はドッカーが初めてです。Jenkinsを使用してローカルマシン(Ubuntu 16.04)でdockerを使用しようとしました。
以下のパイプラインスクリプトを使用して新しいジョブを構成しました。
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
しかし、以下のエラーで失敗します。
私はドッカーが初めてです。Jenkinsを使用してローカルマシン(Ubuntu 16.04)でdockerを使用しようとしました。
以下のパイプラインスクリプトを使用して新しいジョブを構成しました。
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
しかし、以下のエラーで失敗します。
回答:
ユーザーをjenkins
グループに追加する必要がありますdocker
:
sudo usermod -a -G docker jenkins
次に、Jenkinsを再起動します。
dockerからこのメッセージを受け取ったためにスタックオーバーフローのこの質問に到達したが、jenkinsを使用していない場合、おそらくエラーは同じです。非特権ユーザーはdockerグループに属していません。
できるよ:
sudo usermod -a -G docker alice
またはユーザー名が何であれ。
あなたは最後にそれをチェックして、grep docker /etc/group
次のようなものを見ることができます:
docker:x:998:alice
いずれかの行で。
次に、ユーザーグループIDをdocker
次のように変更します。
newgrp docker
sudo usermod -a -G docker $USER
。ログアウトまたは再起動します。リンク
newgrp docker
。同じ端末セッションで代わりに使用してください。
私の最初の解決策は:
usermod -aG docker jenkins
usermod -aG root jenkins
chmod 664 /var/run/docker.sock
しかし、それらのどれも私のために機能しません、私は試しました:
chmod 777 /var/run/docker.sock
それは機能しますが、それが正しい呼び出しであるかどうかはわかりません。
docker.sock
ファイルへのアクセスを増やすことは最善の解決策ではありませんusermod
。...の手順を実行し、システムを再起動するだけです。それ以外の場合は有効になりません
2018-08-19
私はこれについて何日も行き詰まっています。その理由と方法についての完全な答えが見つからないので、同じ問題に遭遇し、上記の回答が機能しない他の人に投稿します。
これらは、Docker内でJenkinsを実行する際の3つの重要なステップです。
/var/run/docker.sock
ホストからdockerを使用できるようにするために、ソケットをjenkinsコンテナーにマウントします。sudo usermod -a -G docker jenkins
dockerグループにジェンキンを追加するために実行します。ただし、ホストDockerとコンテナーDockerに同じグループIDがない場合、アクセス許可の問題が発生する可能性があるため、コンテナーDockerのGIDをホストDockerのGIDと同じになるように調整することが非常に重要です。これは、起動スクリプトの一部として、または単にexec
手動で使用して実行することで実行できますgroupmod -g <YOUR_HOST_DOCKER_GID> docker
。
また、セキュリティのリスクが大きいため、777やそのようなもののアクセス許可を変更しない/var/run/docker.sock
でください。基本的には、マシンでdockerを使用するためのアクセス許可をすべてのユーザーに与えます
お役に立てれば
ルートグループにjenkinsユーザーを追加し、jenkinsを再起動すると動作しました。
sudo usermod -a -G root jenkins
sudo service jenkins restart
docker.sockファイルのアクセス許可を変更する
chmod 777 /var/run/docker.sock
またはuをsudo
コマンドの最初に使用できます。
chmod 777
すべてのユーザーにすべてのアクションをchmod 666
許可し、すべてのユーザーにファイルの読み取りと書き込みを許可しますが、ファイルを実行することはできません。
単に追加docker
として補助グループのためのjenkins
ユーザー
sudo usermod -a -G docker jenkins
DockerイメージをJenkinsエージェントとして使用する場合は、必ずしも十分ではありません。つまり、次のいずれかでJenkinsfile
始まるpipeline{agent{dockerfile
場合pipeline{agent{image
:
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
}
}
stages {
これは、Jenkinsがdocker run
コマンドを実行するため、3つの問題が発生するためです。
docker run
はコンテナにログインしないため、エージェントには補足グループがありません(それはに似ていますsudo
)。Dockerイメージ内でDockerプログラムを利用できるようにするには、DockerfileでDockerインストール手順を実行するだけです。
# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get -y update && \
apt-get -y install \
docker-ce \
docker-ce-cli \
containerd.io
...
以前言われていることがあるドッカーデーモンとドッカーデーモンソケットを共有するようにジェンキンスドッカー容器を実行する第二の問題の固定手段、外容器。したがって、その共有でDockerコンテナーを実行するようにJenkinsに指示する必要があります。
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
3番目の問題に対する理想的な修正は、エージェントの補足グループを設定することです。それは不可能のようです。私が知っている唯一の修正は、Jenkins UIDとDocker GIDを使用してエージェントを実行することです(ソケットにはグループ書き込み権限があり、が所有していますroot.docker
)。しかし、一般的に、あなたはそれらのIDは、(ときに割り当てられていたが何であるかを知らないuseradd ... jenkins
とgroupadd ... docker
、RANジェンキンスとドッカーがホストにインストールされたとき)。そして、Jenkinsにユーザーuser jenkins
とgroup を単に伝えることはできませんdocker
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
ので、それが命名されているユーザーとグループを使用するドッカーに指示jenkins
し、docker
画像内の、そしてあなたのドッカーイメージはおそらく持っていないjenkins
ユーザーやグループを、そしてそれがなかった場合でも、それは同じUIDやGIDなどを持っているでしょう保証はないだろうホスト、そして同様にdocker
GIDが同じである保証はありません
幸い、Jenkinsはdocker build
Dockerfile のコマンドをスクリプトで実行するため、シェルスクリプトの魔法を使ってその情報をDockerビルド引数として渡すことができます。
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
additionalBuildArgs '--build-arg JENKINSUID=`id -u jenkins` --build-arg JENKINSGID=`id -g jenkins` --build-arg DOCKERGID=`stat -c %g /var/run/docker.sock`'
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
}
}
これは、id
コマンドを使用してユーザーのUIDとGIDを取得し、コマンドを使用してDockerソケットに関する情報を取得します。jenkins
stat
Dockerfileはその情報を使用して、およびを使用して、エージェントのjenkins
ユーザーとdocker
グループを設定できます。groupadd
groupmod
useradd
# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
ARG JENKINSUID
ARG JENKINSGID
ARG DOCKERGID
...
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get -y update && \
apt-get -y install \
docker-ce \
docker-ce-cli \
containerd.io
...
# Setup users and groups
RUN groupadd -g ${JENKINSGID} jenkins
RUN groupmod -g ${DOCKERGID} docker
RUN useradd -c "Jenkins user" -g ${JENKINSGID} -G ${DOCKERGID} -M -N -u ${JENKINSUID} jenkins
-u jenkins:$(getent group docker | cut -d: -f3)
?
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
によってargs '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker'
-uジェンキンス渡すとき:ドッキングウィンドウを、あなたは、ワークスペースに言わせたときに、ユーザーの書き込みファイル、それはファイルを設定します平均一次ユーザグループを変更しますユーザーをjenkinsに、グループをdockerに。これはおそらく私たちが意図したものではありません。
私はDockerでJenkinsを実行していて、接続されたJenkinsはホストマシンUbuntu 16.04からボリュームを介して/var/run/docker.sockへのDockerソケットを使用しています。
私にとっての解決策は:
1)JenkinsのDockerコンテナー内(docker exec -it jenkins bash
ホストマシン上)
usermod -a -G docker jenkins
chmod 664 /var/run/docker.sock
service jenkins restart (or systemctl restart jenkins.service)
su jenkins
2)ホストマシン:
sudo service docker restart
664
意味-グループの所有者とユーザーの読み取りと書き込み(実行は不可)。
本番構成を行っているときに、権限の問題が発生しました。以下の解決策を試して問題を解決しました。
エラーメッセージ
ubuntu@node1:~$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
解決策:エラーメッセージ/var/run/docker.sockに示されたソケットの権限:
ubuntu@ip-172-31-21-106:/var/run$ ls -lrth docker.sock
srw-rw---- 1 root root 0 Oct 17 11:08 docker.sock
ubuntu@ip-172-31-21-106:/var/run$ sudo chmod 666 /var/run/docker.sock
ubuntu@ip-172-31-21-106:/var/run$ ls -lrth docker.sock
srw-rw-rw- 1 root root 0 Oct 17 11:08 docker.sock
docket.sockの権限を変更した後、以下のコマンドを実行して権限を確認します。
ubuntu@ip-172-31-21-106:/var/run$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
2019-02-16
ほとんどのステップは、他の人が書いたのと同じでした。 しかし、上記のソリューションでusermodを使用してグループDockerにジェンキンを追加することはできませんでした。
docker hostと実行中のdocker containerから次のコマンドを試しました:
sudo usermod -a -G docker jenkins
(私はdocker hostから次のコマンドで実行中のdockerコンテナーに入りました:
docker exec -t -i my_container_id_or_name /bin/bash
)
Dockerホストから受信:
usermod:ユーザー「jenkins」は存在しません
Dockerコンテナーから受信:
地元のシステム管理者から通常の講義を受けたと信じています。これは通常、次の3つに要約されます。
#1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility.
[sudo] jenkinsのパスワード:
パスワードを知りませんでした。
sudo
コマンドの一部なしで、私が受け取ったdockerコンテナーで:
usermod:権限が拒否されました。usermod:/ etc / passwdをロックできません。あとでもう一度試してみてください。
解決策:次のコマンドを使用して、Dockerホストから実行中のDockerコンテナー に入りました。
docker exec -t -i -u root my_container_id_or_name /bin/bash
ここで、rootとして入力し、次のコマンドを発行しました。
usermod -a -G docker jenkins
次に、Dockerホストから、次のコマンドを使用して実行中のDockerコンテナーを再起動しました。
docker restart my_container_id_or_name
その後、私はジェンキンスの仕事を始め、それは成功して終了しました。
rootユーザーのみを使用して、ユーザーにusermod
コマンドを発行しましたjenkins
。
2019-05-26
これは私のために働いた!
docker-composeの例:
version: "3"
services:
jenkins:
image: jenkinsci/blueocean
privileged: true
ports:
- "8080:8080"
volumes:
- $HOME/learning/jenkins/jenkins_home:/var/jenkins_home
environment:
- DOCKER_HOST=tcp://socat:2375
links:
- socat
socat:
image: bpack/socat
command: TCP4-LISTEN:2375,fork,reuseaddr UNIX-CONNECT:/var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
expose:
- "2375"
私は同様の問題に直面しました。これは権限の問題であり、この問題の原因は、Dockerデーモン/サーバーが常にroot
ユーザーとして実行され、常にdockerコマンドの前にを付けたいためですsudo
。
Dockerデーモンは、TCPポートではなくUnixソケットにバインドします。デフォルトでは、Unixソケットはユーザーが所有し、root
他のユーザーはを使用してのみアクセスできますsudo
。
これを修正するために、私のために働いたものがここにあります:
まず、Dockerグループが既に作成されているかどうかを確認します。
cat /etc/group
docker
表示されるリストで見つからない場合は、作成する必要があります。
sudo groupadd docker
次に、以下のコマンドを使用してuser
とを確認しますgroup
。
cat /etc/group
スクロールして、Dockerのグループを確認します。この形式にする必要があります
docker:x:140:promisepreston
どこdocker
私れるgroup
とpromisepreston
私ですuser
これで、ユーザーをdockerグループに追加できます
Dockerコンテナーファイルの場合のみ:
実行したい、実行しようとしている、またはアクセス許可の問題を引き起こしているdocker image / container / commandに関係なく、以下のコマンドをコピーし、ターミナルでそれを変更せずに正確に記述します。
sudo usermod -aG docker $USER
上記のコマンドを実行した後、ログアウトしてから再度ログインし、グループメンバーシップを再評価する必要があります。ただし、Linuxでは、以下のコマンドを実行してグループへの変更をアクティブ化することもできます(以下のdocker image / container / commandに関係なく、それを変更せずに、ターミナルで以下のコマンドをコピーして、記述されているとおりに実行します。実行したい、実行しようとしている、または許可の問題を解決している):
newgrp docker
権限の問題を引き起こしているコマンドを再度実行して、sudo権限なしでdockerコマンドを実行できることを確認できます(次のように置き換えmy-command
ます(image / container / commandの名前に置き換えます):
docker run my-command
Dockerおよびローカルファイルシステムファイルの場合:
ローカルファイルシステムにファイルのコピーがある場合は、次の形式を使用して、アプリケーションファイルが格納されているアプリケーションディレクトリの所有権を変更できます。
sudo chown <your_user>:<your_group> -R my-app-directory/
したがって、私の場合は次のようになります。
sudo chown promisepreston:docker -R my-app-directory/
注:このコマンドは、アプリケーションディレクトリを含む親ディレクトリ内で実行してください。
それで全部です。
これが役に立てば幸い
Dockerコンテナー内でJenkinsを実行しています。私にとって最も簡単な解決策は、GIDを動的に設定するカスタムイメージを作成することでした。
FROM jenkins/jenkins:lts
...
CMD DOCKER_GID=$(stat -c '%g' /var/run/docker.sock) && \
groupadd -for -g ${DOCKER_GID} docker && \
usermod -aG docker jenkins && \
sudo -E -H -u jenkins bash -c /usr/local/bin/jenkins.sh
参照:https : //github.com/jenkinsci/docker/issues/263
または、次のオプションでjenkinsを起動することもできます。
-v /var/run/docker.sock:/var/run/docker.sock \
-u jenkins:$(getent group docker | cut -d: -f3)
これは、jenkinsイメージにDockerクライアントがインストールされていることを前提としています。参照:https : //getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
以下のようなエラーが発生する場合は、
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
または
level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: permission denied"
次のコマンドを実行してみてください。
$ sudo su - jenkins
$ sudo usermod -a -G docker $USER
$ sudo chown jenkins:docker /var/run/docker.sock
usermod -a -G docker jenkins
とchown jenkins:docker /var/run/docker.sock
私は公式の jenkins Dockerイメージ(https://hub.docker.com/r/jenkins/jenkins)を使用していますが、このソリューションは、Dockerコンテナー内でDockerを実行するほとんどのユースケースに適用できると思います。
Dockerコンテナー内でDockerを使用するための推奨される方法は、ホストシステムのDockerデーモンを使用することです。それに関する良い記事:https : //itnext.io/docker-in-docker-521958d34efd。
この質問に関するアクセス許可の問題を処理するための秘訣は、ホストシステムではなく、コンテナー内のコンテナーのユーザーにアクセス許可を追加することです。rootユーザーのみがデフォルトでそれを行う権限を持っているので、
docker exec -it -u root <container-name> bash
usermod -a -G docker <username>
それを行います。コンテナを再起動することを忘れないでください。
これを実現する最も簡単な方法は、カスタマイズされたDockerfileを作成することだと思います。
# Official jenkins image
FROM jenkins/jenkins:lts
# Swith to root to be able to install Docker and modify permissions
USER root
RUN apt-get update
# Install docker
RUN curl -sSL https://get.docker.com/ | sh
# Add jenkins user to docker group
RUN usermod -a -G docker jenkins
# Switch back to default user
USER jenkins
# Bild the image:
# sudo docker build -t yourusername/imagename .
# Run the image and mount with the followin bind mount option:
# sudo docker run --name imagename -d -p8080:8080 -v /var/run/docker.sock:/var/run/docker.sock yourusername/imagename
私の場合、これは正常に動作します。ローカルリポジトリに移動して、このコマンドを入力します。
sudo chmod 666 /var/run/docker.sock
Jenkinsが実行されているサーバーで、私は使用しました
sudo setfacl -m user:tomcat:rw /var/run/docker.sock
そして、各Dockerコンテナを実行します
-v /var/run/docker.sock:/var/run/docker.sock
setfaclの使用はより良いオプションのように思われ、「-uユーザー」は必要ありません。コンテナは、Jenkinsを実行しているのと同じユーザーとして実行されます。しかし、セキュリティの専門家からのフィードバックをいただければ幸いです。
dockerfileの下で使用
FROM jenkins/jenkins
USER root
# Install Docker
RUN apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
# Compose
RUN curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
RUN usermod -aG docker jenkins
RUN usermod -aG root jenkins
USER jenkins
たぶん、最初から「-u root」オプションを指定してDockerを実行する必要があります
少なくともそれで私の問題は解決しました
root
。Docker 18.06.1では、少なくともこれが私に起こったことです。