首先盜圖一張
1.在Github上創建一個測試倉庫
2.創建基於Asp.net Core的MVC項目
運行解決方案,驗證代碼沒有問題,然后將代碼遷入Github
3.添加Docker支持
項目-->添加-->Docker 支持
提示框選擇【Linux】,點擊確定
系統會自動添加相應的Dockerfile文件和docker-compose文件
此處使用默認的Dockerfile,僅修改端口號,該端口號需要跟shell文件對應
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80
修改Dockerfile文件的屬性
向項目中添加setup.sh文件(之后的Jenkins會用到,此處與代碼並無關系)
文件中的內容如下:
image_version=`date +%Y%m%d%H%M`; echo $image_version; # cd Jenkins2Docker
git pull --rebase origin master; docker stop jenkins2docker; docker rm jenkins2docker; docker build -t jenkins2docker:$image_version .; docker images; docker run -p 10001:80 -d --name jenkins2docker jenkins2docker:$image_version; # -v ~/docker-data/house-web/appsettings.json:/app/appsettings.json -v ~/docker-data/house-web/NLogFile/:/app/NLogFile --restart=always
docker logs jenkins2docker; #刪除build過程中產生的鏡像 #docker image prune -a -f
docker rmi $(docker images -f "dangling=true" -q)
完成以上操作后,將代碼遷入Github。
此處需要注意的是:
- build過程中會產生一個鏡像,該問題可參考博文 Docker 刪除所有無名稱的鏡像(懸空鏡像)
- 構建鏡像的名字不能有大寫字母,否則會構建失敗:
4.配置Jenkins
4.1新建一個“自由風格的軟件項目”
4.2設置General信息
4.3配置源碼信息
4.4構建觸發器
(H/2表示2分鍾做一次查詢)
4.5設置構建環境
4.6構建選擇shell
4.7保存
點擊【應用】-->【保存】
頁面跳轉后,點擊【立即構建】(此處不點擊,2分鍾內也會自動構建)
4.8查看構建結果
如圖顯示了5次構建,頭三次的紅色表示構建失敗,4、5次的藍色表示構建成功
5.驗證結果
5.1查看鏡像
鏡像到Tag是在shell文件中設置的,由時間字符串拼接而成,可以看到.net core生成的鏡像還是很小的,畢竟包含了一個253M的run-time。
5.2查看容器
IMAGE:此處看到容器構建依賴的鏡像,確實是我們剛剛生成的鏡像。
STATUS:如果status的狀態不是Up,可以通過Jenkins構建的后台查看是否構建出現問題。
PORTS:10001->80,80是我們在dockerfile中expose到端口,10001是容器創建時映射到服務器到端口。
5.3查看網址
6.寫在最后
不知是不是shell文件寫的有問題,亦或是我該改設置dockerfile生成路徑?
代碼遷入時需要修改下Dockerfile的路徑,即從Jenkins2Docker內改到上一級的目錄。
有明白的朋友可以留個言
7.參考
https://cloud.tencent.com/developer/news/223449
https://www.cnblogs.com/sunshine-wy/p/9860599.html
https://www.cnblogs.com/TomGui/archive/2017/04/06/6673084.html
8.常見錯誤
8.1.Dockerfile編譯報錯
Failed to build: Error parsing reference: “microsoft/dotnet:2.1-runtime AS base” is not a valid repository/tag
解決方法:
該問題出現的原因是docker的版本過低,具體如下
FROM microsoft/aspnetcore-build:2.0 AS buildenv Error parsing reference
8.2報錯:鏡像被多個repositories引用
Error when deleting images - image is referenced in multiple repositories
docker rmi -f <IMAGE_ID>
參考:https://github.com/portainer/portainer/issues/497
8.3刪除虛掛鏡像
docker rmi $(docker images -f "dangling=true" -q)
參考:http://www.cnblogs.com/stulzq/p/8962388.html