netcore 3.1 項目部署到docker 及遇到的各種坑 和 對應解決方案


十年河東,十年河西,莫欺少年窮

學無止境,精益求精

 搞了快一天了,終於成功部署了netcore項目到docker 

按照上篇博客的發布方法進行發布,上篇博客:netcore3.1 dockerfile 生成鏡像 並 部署到 linux 系統 

1、發布之前,需要說明的是,將項目Dockerfile 、Swagger 文檔XML文件屬性統統設置為:始終復制

 

2、編寫項目Dockerfile 文件為如下,這一步最重要,否則,你會遇到各種奇葩的問題,我的Dockerfile如下:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
#ENV :配置系統環境變量,比如程序環境環境等在這里配置(開發、預發、線上環境)
#這里是配置程序運行端口 如果程序不使用默認的80端口這里一定要設置(程序運行端口)
ENV ASPNETCORE_URLS http://+:80
#設置時間為中國上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY . /app
WORKDIR /app
EXPOSE 80
ENTRYPOINT ["dotnet", "WuAnFundApi.dll"]

這里需要說明的是:

前兩個 FROM 不能少,是運行環境及依賴

容器運行時間采用上海,因為默認為美國時間

COPY .  /app 第一個 . 代表發布的文件所在的 Linux 系統的目錄,第二個 /app 是要復制到的目錄,這里 /app 必須和 WORKDIR 的 /app 保持一致

EXPOSE 80 ,代表暴露80端口,因為沒有暴露 443 端口,我們需要將netcore 代碼 startUp.cs  中的這段注釋掉,聲明不使用 HTTPS

            //app.UseHttpsRedirection();

如果要使用HTTPS協議,需要SSL證書,如果你有ssl證書,可以這樣增加一個443端口

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
#ENV :配置系統環境變量,比如程序環境環境等在這里配置(開發、預發、線上環境)
#這里是配置程序運行端口 如果程序不使用默認的80端口這里一定要設置(程序運行端口)
ENV ASPNETCORE_URLS http://+:80
#設置時間為中國上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY . /app
WORKDIR /app
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["dotnet", "WuAnFundApi.dll"]

更詳細信息可參考https://www.cnblogs.com/yiting/p/13388155.html  或   http://t.zoukankan.com/shapman-p-13545457.html

3、將發布的文件放入linux系統,我這里采用的SCP命令,關於SCP命令,大家可參考鄙人博客:windows 下使用SCP命令傳遞文件/文件夾到Liunx系統

 4、發布文件放入Linux系統后,cd 到該目錄下,執行Build命令,構建鏡像

[root@localhost webapp]# docker build -f Dockerfile  -t webapp:1.0 .

/5、構建成功后,運行鏡像到容器

 docker run -it --name webapp01 --restart=always -p 8088:80  -v /root/share/webapp:/app  d3abddc5e300 /bin/bash

如果你使用443端口,可以這樣聲明:

docker run -it --name webapp01  --restart=always -p 80:80  -p 443:443  -v /root/share/webapp:/app d3abddc5e300 /bin/bash

這里做個簡單說明:

-it  已交互模式進入容器

--restart=always  容器會隨着docker的啟動而自動啟用,這樣就無需再手動開啟

-v 是掛載  

 

 在這里,我們發現容器還有部分錯誤,表現為:log4net相關配置有問題, 如下

 

 上圖中也包含了查看容器日志的命令,通過日志信息,我們同樣發現Log4Net確實有錯誤,解決了Log4Net的錯誤后,不知道是否還會有其他幺蛾子錯誤,但程序就是這樣,發現問題,解決問題,待所有問題解決后,我們就可以通過 curl 命令,訪問我們的swageer了

curl localhost:8088/WuAnFundApi/swagger/index.html

今日先到這兒,回家做核酸了,媽的,天天做核酸,坐標蘇州。

繼續

log4net 似乎對linux的支持不太好,因此,我在項目中去掉log4net,重新打包鏡像,運行容器后,就成功了

linux請求swagger 如下:

 

 瀏覽器中請求:

 

 在swagger的展示過程中,由於鄙人將URL地址輸成了:http://192.168.136.135:8088/WuanFundApi/Swagger/index.html  導致陷入了鑽牛角,百度查不到,就去必應,必應國內版查不到,又去了必應國際版,總之各種查資料,后來發現是自己的URL拼錯了,正確的為:http://192.168.136.135:8088/swagger/index.html ,總之,不需要單獨為swagger下載鏡像啥的。

這樣就

  大功告成了

@天才卧龍的波爾克


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM