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:
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:
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:
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:
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:
Apakah 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"]#############################################