Sadece kullanıcı için ek bir grupdocker
olarak eklemejenkins
sudo usermod -a -G docker jenkins
Jenkins Aracısı olarak bir Docker görüntüsü kullanırken her zaman yeterli değildir . Yani, veya Jenkinsfile
ile başlarsanız :pipeline{agent{dockerfile
pipeline{agent{image
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
}
}
stages {
Bunun nedeni Jenkins'in docker run
üç soruna yol açan bir komut gerçekleştirmesidir .
- Aracıda (muhtemelen) Docker programları yüklü olmaz.
- Aracı, Docker arka plan programı yuvasına erişemeyecektir ve bu nedenle, önerilmeyen Docker-in-Docker'ı çalıştırmayı deneyecektir .
- Jenkins, Agent'ın kullanması gereken sayısal kullanıcı kimliğini ve sayısal grup kimliğini verir. Temsilcinin herhangi bir ek grubu
docker run
olmayacaktır , çünkü konteynere giriş yapmaz (daha çok a'ya benzer sudo
).
Aracı için Docker'ı Yükleme
Docker programlarını Docker görüntüsünde kullanılabilir hale getirmek için Dockerfile dosyanızdaki Docker kurulum adımlarının çalıştırılması yeterlidir:
# 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 arka plan programı yuvasını paylaşma
Daha önce de belirtildiği gibi , ikinci sorunun düzeltilmesi Jenkins Docker kapsayıcısını çalıştırmak anlamına gelir, böylece Docker arka plan programı soketini konteynerin dışındaki Docker arka plan programı ile paylaşır . Bu nedenle Jenkins'e Docker kapsayıcısını bu paylaşımla çalıştırmasını söylemeniz gerekir, böylece:
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
UID'leri ve GID'leri ayarlama
Üçüncü sorun için ideal çözüm, Temsilci için ek gruplar oluşturmak olacaktır. Bu mümkün görünmüyor. Fark ettiğim tek düzeltme Agent'ı Jenkins UID ve Docker GID ile çalıştırmak (soketin grup yazma izni var ve ait olduğu root.docker
). Ancak genel olarak, bu kimliklerin ne olduğunu bilmiyorsunuz ( Jenkins ve Docker ana bilgisayara yüklendiğinde useradd ... jenkins
ve groupadd ... docker
çalıştırıldıklarında ayrıldılar ). Ve Jenkins'e kullanıcı kullanıcı jenkins
ve grubuna söyleyemezsiniz.docker
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
çünkü bu , Docker'a adlandırılmış jenkins
ve docker
görüntü içindeki kullanıcı ve grubu kullanmasını söyler ve Docker görüntünüzde muhtemelen jenkins
kullanıcı ve grup yoktur ve bunu yapsa bile aynı UID ve GID'ye sahip olacağını garanti etmez ve benzer şekilde docker
GID'in aynı olduğuna dair bir garanti yoktur.
Neyse ki Jenkins docker build
Dockerfile komutunuzu bir komut dosyasında çalıştırır, böylece Docker oluşturma argümanları olarak bu bilgileri iletmek için bazı kabuk komut dosyası sihirleri yapabilirsiniz:
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'
}
}
Yani kullanır id
almak için komut UID ve GID ait jenkins
kullanıcı ve stat
Docker soket hakkında bilgi almak için komutu.
Kişisel Dockerfile kurulum a bu bilgileri kullanabilir jenkins
kullanıcı ve docker
kullanma, Agent için grubun groupadd
, groupmod
ve 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