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 Jenkinsfileile başlarsanız :pipeline{agent{dockerfilepipeline{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 runolmayacaktı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 ... jenkinsve groupadd ... dockerçalıştırıldıklarında ayrıldılar ). Ve Jenkins'e kullanıcı kullanıcı jenkinsve grubuna söyleyemezsiniz.docker
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
çünkü bu , Docker'a adlandırılmış jenkinsve docker görüntü içindeki kullanıcı ve grubu kullanmasını söyler ve Docker görüntünüzde muhtemelen jenkinskullanıcı ve grup yoktur ve bunu yapsa bile aynı UID ve GID'ye sahip olacağını garanti etmez ve benzer şekilde dockerGID'in aynı olduğuna dair bir garanti yoktur.
Neyse ki Jenkins docker buildDockerfile 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 idalmak için komut UID ve GID ait jenkinskullanıcı ve statDocker soket hakkında bilgi almak için komutu.
Kişisel Dockerfile kurulum a bu bilgileri kullanabilir jenkinskullanıcı ve dockerkullanma, Agent için grubun groupadd, groupmodve 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