環境依據如下:Docker Desktop for Mac / M2
在我們開始Jenkins pipeline流水線之前,如果你需要在Jenkins中使用到Docker可以瀏覽這篇文章,通常在完整的pipeline CICD流程,會需要借助docker的協助來達成很多事,而我在環境上卡了非常多天,如果直接掛載docker.sock使用image jenkins/jenkins,我的環境是無法正常運行docker的。
希望給其他在環境跟我遇到類似狀況的,有一個參考方向。
因為在前例使用的image jenkins/jenkins,並非在官方推薦使用的image中,以及在pipeline中無法正常使用docker,起先無法辨別docker指令,所以我下載了docker.io文件,但還是沒辦法通過docker daemon的阻擋,研究了幾天,決定改另外創建一個container並使用官方推薦的image(mac 使用docker下載jenkins),就能直接正常辨識docker指令,並且不需要做太多的預設配置。
常常看到的Jenkins配置方式如下,且 image為jenkins/jenkins
,使用在docker desktop + mac環境無效。(只單純做以下方式,仍無法使用docker,還要下載docker.io)
docker run \
-u root \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/local/build/jdk/jdk-17.0.8:/var/jenkins_home/jdk \
-v /usr/local/build/maven/apache-maven-3.9.4:/var/jenkins_home/maven \
--name jenkins3 \
jenkins/jenkins
docker exec -it jenkins_container_name bash # 進到容器內部
apt-get update && apt-get install -y docker.io # 下載docker文件,才可辨識docker指令
image jenkinsci/blueocean
可以使用Docker,但建議需要更新版本這邊我把端口號映射為8086,以及掛載docker.sock才有權限使用docker,並且一併把本機的JDK、Maven、以及要新版本的Jenkins.war檔一併掛載進去容器內,啟動後會直接是我掛載進去的版本。
因為 jenkinsci/blueocean
的Jenkins版本目前比較低。Jenkins官方下載新版本
使用者設為root,不然在mac環境是會報錯,會顯示有些文件無法讀寫,導致無法正常啟動成功。
下則文章也會分步驟講解,如果你已經是現有容器了,事後掛載也可以。
docker run \
-u root \
-p 8086:8080 \
-p 50006:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/local/build/jdk/jdk-17.0.8:/var/jenkins_home/jdk \
-v /usr/local/build/maven/apache-maven-3.9.4:/var/jenkins_home/maven \
-v /Users/lulu/Desktop/jenkins.war:/usr/share/jenkins/jenkins.war \
--name jenkins3 \
jenkinsci/blueocean
簡單來說,就是在Docker容器中又再創建了一個Docker,因為要配置的東西更多,所以使用docker-compose.yml。使用這個非常耗費效能!通常複雜情況才會使用。
創建一個docker-compose.yml檔案,配置Jenkins容器以及docker bind
這是我找了很久,終於找到有人找到解決方式 → 引用來源
user 指定root是因為沒有指定會導致有些文件無法有權限取得,會無法正常啟動,所以配置root。
不建議加上 - $HOME:/home
這行,這是把本地的Home掛載上去,有可能會同步影響本地的檔案。
version: '3.1'
networks:
docker:
volumes:
jenkins-data:
jenkins-docker-certs:
services:
jenkins:
image: jenkinsci/blueocean
restart: always
networks:
- docker
ports:
- 8085:8080
- 50005:50000
tty: true
user: root
volumes:
- jenkins-data:/var/jenkins_home
- jenkins-docker-certs:/certs/client:ro
environment:
- DOCKER_HOST=tcp://docker:2376
- DOCKER_CERT_PATH=/certs/client
- DOCKER_TLS_VERIFY=1
dind:
image: docker:dind
privileged: true
restart: always
networks:
docker:
aliases:
- docker
ports:
- 2376:2376
tty: true
volumes:
- jenkins-data:/var/jenkins_home
- jenkins-docker-certs:/certs/client
- $HOME:/home
environment:
- DOCKER_TLS_CERTDIR=/certs
如果有加上加上 - $HOME:/home
這行,啟動時,Docker desktop 會跳出視窗提醒,是不是要開放本機資源供docker使用
jenkins2 是使用Dood以及 image jenkinsci/blueocean 構建
api項下的jenkins-1 是使用 Dind 以及 image jenkinsci/blueocean 構建
兩者同時啟動與運行,就能很清楚的看見實際CPU佔比的差異,目前還沒想到什麼情況下一定要使用Docker In Docker,以這兩種實際測試,都可以正常跑pipeline以及使用Docker指令的。
下一篇再說明如何在現有的容器中更新Jenkins版本,以及轉換為jenkinsci/bueocean image啟動Jenkins可能會遇到的問題,以及如何排解。