Kebingungan dengan Jenkins Docker Plugin dan Jenkins Docker budak

Jadi saya terkejut dalam beberapa hal melihat plugin Docker Jenkins "mendorong" gambar Docker ke logam host Docker saya tetapi juga membingungkan karena build saya sedang berlangsung di wadah budak Docker yang berjalan di logam host Docker. Bahkan Master Jenkins saya berjalan dalam wadah buruh pelabuhan, tidak langsung pada logam...

Setelah ini populer Jenkins master / panduan budak Saya sampai pada titik di mana saya memiliki Jenkins build yang bekerja kontainer Docker singkat.

Ini berarti bahwa ketika saya melakukan Jenkins build dari beberapa komponen/layanan perangkat lunak kode sumber saya, build dimulai di Budak Jenkins yang kebetulan merupakan wadah buruh pelabuhan yang dipintal oleh Plugin buruh pelabuhan Jenkins.

Ruang Kerja Jenkins ada di wadah slave ini, Master Jenkins dengan plugin Docker diinstal, akan membuang wadah slave ini setelah build selesai. Lihat diagram yang saya buat untuk membantu menjelaskan:

enter image description here

Beberapa poin tindak lanjut penting setelah Anda mencerna diagram ini:

  • Jenkins Master dan Jenkins Slave berjalan pada Docker host Metal yang sama pada saat ini, karena saya baru pada tahap awal menjalankan sistem ini
  • Saya menggunakan plugin Docker dan Plugin SSH Slave untuk menyelesaikan pengaturan ini

Jadi dalam Budak buruh pelabuhan ini artefak pembuatan komponen/layanan perangkat lunak saya dibuat, bisa jadi, misalnya, A .dll atau .perang. Kebetulan artefak build saya akan menjadi gambar buruh pelabuhan. Untuk menjadi jelas, saya membangun gambar Docker di dalam wadah Docker yang sedang berjalan (budak Jenkins).

Kebingungan saya dimulai dengan harapan saya bahwa saya harus secara eksplisit menjalankan cmd untuk mendorong artefak pembuatan gambar Docker komponen perangkat lunak saya ke registri Docker. Jika tidak, ketika Pekerjaan Build Jenkins selesai, plugin buruh pelabuhan akan mematikan budak kontainer buruh pelabuhan, membuang (rm) wadah budak dan daripada saya akan kehilangan artefak build di dalam wadah budak itu.

Apa yang sebenarnya terjadi, dan mengapa saya terkejut, setidaknya dalam jangka pendek saat saya menjalankan dan menjalankan devops, adalah bahwa gambar Docker artefak build muncul di logam host Docker, docker image ls.

Saya terkejut bahwa plugin Docker akan pergi ke tingkat asumsi/bantuan ini... Saya tahu plugin Docker memungkinkan Anda untuk mengkonfigurasi registri Docker dan Anda dapat menambahkan langkah build untuk membangun / mempublikasikan ke Cloud Docker yang saya asumsikan bahwa cloud diperlakukan sebagai registri untuk gambar dan mungkin tempat untuk juga menjalankan gambar-gambar itu juga:

enter image description here

Yang sangat menarik adalah saya tidak menggunakan plugin Docker untuk langkah build apa pun, saya hanya menggunakan plugin Docker untuk mengonfigurasi wadah Slave untuk item build Jenkins:

enter image description here

Satu-satunya langkah membangun yang saya miliki adalah saya menjalankan skrip Shell, ya skrip ini kebetulan pada akhirnya membangun gambar Docker tetapi Plugin Docker tidak akan mengetahui hal ini:

enter image description here

Plugin Docker memutar wadah budak Docker, saya mengonfigurasi plugin Docker dan menceritakannya sebagai Host Docker (logam saya dalam situasi saya) Cloud adalah apa yang disebut Plugin Docker sebagai Host Docker dan juga gambar budak Docker untuk digunakan pada Host/Cloud Docker itu:

enter image description hereApakah saya hanya memiliki kesalahpahaman tentang seberapa terisolasi Jenkins membangun ruang kerja ketika berada di dalam wadah budak buruh pelabuhan?

Apakah plugin Docker hanya default untuk menggunakan satu-satunya Docker Cloud (logam host Docker saya) saya memiliki pengaturan untuk semua perintah docker yang kebetulan saya jalankan di dalam wadah budak Docker Jenkins? (wadah budak dengan cara yang memiliki Docker-CE diinstal di atasnya)

Saya Jenkins Master Dockerfile:

#reference#https://engineering.riotgames.com/news/putting-jenkins-docker-containerFROM jenkins:2.60.1MAINTAINER Brian OgdenUSER root#TimezoneENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# Prep Jenkins DirectoriesRUN mkdir /var/log/jenkinsRUN mkdir /var/cache/jenkinsRUN chown -R jenkins:jenkins /var/log/jenkinsRUN chown -R jenkins:jenkins /var/cache/jenkins# Copy in local config filesfilesCOPY plugins.sh /usr/local/bin/plugins.shRUN chmod +x /usr/local/bin/plugins.sh# Install default plugins# Set list of plugins to download / update in plugins.txt like this# pluginID:version# credentials:1.18# maven-plugin:2.7.1# ...# NOTE : Just set pluginID to download latest version of plugin.# NOTE : All plugins need to be listed as there is no transitive dependency resolution.COPY plugins.txt /tmp/plugins.txtRUN /usr/local/bin/plugins.sh /tmp/plugins.txtUSER jenkins#give Jenkins a nice 8 GB memory pool and room to handle garbage collection#ENV JAVA_OPTS="-Xmx8192m"#give Jenkins a nice base pool of handlers and a cap#ENV JENKINS_OPTS="--handlerCountStartup=100 --handlerCountMax=300"ENV JENKINS_OPTS="--logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war"

Saya menggunakan docker-compose dan Docker volume dengan Master Jenkins saya, docker-compose saya.yml:

version: '2'services:  data:    build: data    image: tsl.devops.jenkins.data.image    container_name: tsl.devops.jenkins.data.container  master:    build: master    image: tsl.devops.jenkins.master.image    container_name: tsl.devops.jenkins.master.container    volumes_from:      - data    ports:      - "50000:50000"    #network_mode: "host"  nginx:    build: nginx    image: tsl.devops.jenkins.nginx.image    container_name: tsl.devops.jenkins.nginx.container    ports:      - "80:80"    links:      - master:jenkins-master  slavebasic:    build:      context: ./slaves      dockerfile: basic/Dockerfile    image: tsl.devops.jenkins.slave.basic.image    container_name: tsl.devops.jenkins.slave.basic.container  slavedotnetcore:    build:      context: ./slaves      dockerfile: dotnetcore/Dockerfile    image: tsl.devops.jenkins.slave.dotnetcore.image    container_name: tsl.devops.jenkins.slave.dotnetcore.container

Saya Jenkins Master volume/ drive Dockerfile:

#reference#https://engineering.riotgames.com/news/docker-jenkins-data-persistsFROM centos:7MAINTAINER Brian Ogden#create the Jenkins user in this containerRUN useradd -d "/var/jenkins_home" -u 1000 -m -s /bin/bash jenkins#NOTE: we set the UID here to the same one the Cloudbees Jenkins image uses #so we can match UIDs across containers, which is essential if you want #to preserve file permissions between the containers. We also use the same home directory and bash settings.#Jenkins log directoryRUN mkdir -p /var/log/jenkinsRUN chown -R jenkins:jenkins /var/log/jenkins#Docker volume magicVOLUME ["/var/log/jenkins", "/var/jenkins_home"]USER jenkins#just a little output reminder of the container's purposeCMD ["echo", "Data container for Jenkins"]

Saya Budak Dockerfile:

FROM centos:7MAINTAINER Brian Ogden#the USER will be root by default just explicitly #expressing it for better documentationUSER root# Install EssentialsRUN yum update -y && \         yum clean all############################################## Jenkins Slave setup#############################################RUN yum install -y \    git \    wget \    openssh-server \    java-1.8.0-openjdk \    sudo \    make && \    yum clean all# gen dummy keys, centos doesn't autogen them like ubuntu doesRUN /usr/bin/ssh-keygen -A# Set SSH Configuration to allow remote logins without /proc write accessRUN sed -ri 's/^session\s+required\s+pam_loginuid.so$/session optional pam_loginuid.so/' /etc/pam.d/sshd# Create Jenkins UserRUN useradd jenkins -m -s /bin/bash# Add public key for Jenkins loginRUN mkdir /home/jenkins/.sshCOPY /files/id_rsa.pub /home/jenkins/.ssh/authorized_keys#setup permissions for the new folders and filesRUN chown -R jenkins /home/jenkinsRUN chgrp -R jenkins /home/jenkinsRUN chmod 600 /home/jenkins/.ssh/authorized_keysRUN chmod 700 /home/jenkins/.ssh# Add the jenkins user to sudoersRUN echo "jenkins  ALL=(ALL)  ALL" >> etc/sudoers########################################################################################### Docker and Docker Compose Install##############################################install required packagesRUN yum install -y \    yum-utils \    device-mapper-persistent-data \    lvm2 \    curl && \    yum clean all#add Docker CE stable repositoryRUN yum-config-manager \    --add-repo \    https://download.docker.com/linux/centos/docker-ce.repo#Update the yum package index.RUN yum makecache fast#install Docker CERUN yum install -y docker-ce-17.06.0.ce-1.el7.centos#install Docker Compose 1.14.0#download Docker Compose binary from github repoRUN curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose#Apply executable permissions to the binaryRUN chmod +x /usr/local/bin/docker-compose########################################################################################### .NET Core SDK#############################################RUN yum install -y \    libunwind \    libicuRUN curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=848821RUN mkdir -p /opt/dotnet && tar zxf dotnet.tar.gz -C /opt/dotnetRUN ln -s /opt/dotnet/dotnet /usr/local/bin#add Trade Service Nuget ServerRUN mkdir -p /home/jenkins/.nuget/NuGetCOPY /files/NuGet.Config /home/jenkins/.nuget/NuGet/NuGet.ConfigRUN chown -R jenkins /home/jenkins/.nugetRUN chgrp -R jenkins /home/jenkins/.nugetRUN chmod 600 /home/jenkins/.nuget/NuGet/NuGet.ConfigRUN chmod 700 /home/jenkins/.nuget/NuGet#speed up dotnet core buildsENV NUGET_XMLDOC_MODE skipENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE true############################################## Expose SSH port and run SSHDEXPOSE 22#Technically, the Docker Plugin enforces this call when it starts containers by overriding the entry command. #I place this here because I want this build slave to run locally as it would if it was started in the build farm.CMD ["/usr/sbin/sshd","-D"]

Contoh perangkat lunak / komponen Dockerfile yang akan membuat artefak pembuatan gambar Docker di dalam wadah Docker budak Jenkins:

FROM centos:7MAINTAINER Brian Ogden#TimezoneENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneRUN yum update -y && \         yum clean all############################################## .NET Core SDK#############################################RUN yum install -y \    libunwind \    libicuRUN curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=848821RUN mkdir -p /opt/dotnet && tar zxf dotnet.tar.gz -C /opt/dotnetRUN ln -s /opt/dotnet/dotnet /usr/local/bin#speed up dotnet core buildsENV NUGET_XMLDOC_MODE skipENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE true########################################################################################### .NET Sevrice setup#############################################ARG ASPNETCORE_ENVIRONMENT# Copy our code from the "/src/MyWebApi/bin/Debug/netcoreapp1.1/publish" folder to the "/app" folder in our containerWORKDIR /appCOPY ./src/TSL.Security.Service/bin/Debug/netcoreapp1.1/publish .# Expose port 5000 for the Web API trafficENV ASPNETCORE_URLS http://+:5000ENV ASPNETCORE_ENVIRONMENT $ASPNETCORE_ENVIRONMENT EXPOSE 5000# Run the dotnet application against a DLL from within the container# Don't forget to publish your application or this won't workENTRYPOINT ["dotnet", "TSL.Security.Service.dll"]#############################################

Menurut konfigurasi plugin Docker Anda, Anda menggunakan 172.17.0.1 sebagai Host Docker. Dari wadah slave atau master, ini akan menjadi daemon Docker yang berjalan di host (Tidak ada Docker di Docker yang terjadi di sini). Ketika budak Jenkins Anda membuat gambar (terlepas dari apakah budak berjalan sebagai wadah atau di host) itu menggunakan buruh pelabuhan di host dan inilah mengapa gambar Anda muncul di host.

Perlu dicatat bahwa data kemungkinan pertama kali masuk ke volume buruh pelabuhan yang digunakan oleh budak (menurut Jenkins Dockefile di https://github.com/jenkinsci/docker/blob/9f29488b77c2005bbbc5c936d47e697689f8ef6e/Dockerfile defaultnya adalah /var/jenkins_home). Dalam kasus Anda, Ini hanya volume dari data layanan (meskipun, dalam format Compose v2, anda cukup menentukan volume bernama, anda tidak perlu membuat wadah data). Dari sini, kode Anda dan Dockerfile dikirim ke konteks pembuatan Docker di host melalui API di tcp://172.17.0.1:4243.

Bisakah anda mengkonfirmasi tata letak host? Apakah Jenkins menguasai dan budak pada Host fisik yang berbeda? Juga, plugin Docker mana yang Anda gunakan? Saya perhatikan setidaknya ada dua untuk Jenkins (plugin Docker dan Plugin Docker Slaves, saya tidak yakin apakah anda menggunakan salah satu atau keduanya atau lainnya).

Hai @ AndyShinn, saya memperbarui pertanyaan saya untuk menjawab pertanyaan anda, " - Jenkins Master dan Jenkins Slave berjalan pada Host Metal Docker yang sama pada saat ini, karena saya baru pada tahap awal menjalankan sistem ini

  • Saya menggunakan plugin Docker dan Plugin SSH Slave untuk menyelesaikan pengaturan ini"

Saya punya penjelasan yang bisa saya berikan. Tapi saya bingung pada beberapa bagian yang lebih yang mungkin Anda dapat memperjelas. 1) Bagaimana plugin Docker slaves tahu untuk meluncurkan Jenkins sebagai gambar Slave Docker? Tidak jelas bagi saya bagaimana budak Jenkins sebenarnya meluncurkan gambar dari Dockerfile yang Anda berikan. 2) Dapatkah anda mengkonfirmasi perintah docker run yang Anda gunakan untuk memulai master? Saya bertanya-tanya apakah itu lewat di soket kontrol buruh pelabuhan, dalam hal ini setiap Build dalam wadah hanya akan menggunakan buruh pelabuhan host (jadi, mengapa Anda melihat gambar sedang dibangun di host). Saya akan menguraikan ini sebagai jawaban.

@ AndyShinn ok, saya memperbarui pertanyaan saya dengan informasi yang Anda minta. Saya telah menambahkan Dockerfile saya untuk master Jenkins saya, yang memiliki volume Docker jadi saya menambahkan Dockerfile saya untuk volume data master Jenkins juga. Saya juga menjelaskan, termasuk tangkapan layar konfigurasi Jenkins, bagaimana Anda mengkonfigurasi “plugin Docker”, bukan plugin Docker slaves seperti yang Anda sebut, untuk menggunakan gambar Docker yang ditentukan sebagai budak, Dockerfile saya untuk budak saya termasuk dalam pertanyaan awal saya