使用docker部署.net core3.1時的Dockerfile寫法(持續補充)


對於docker的安裝和基本命令,在此不多做解釋。本文主要針對的是創建容器時的一些坑,以及一些問題的分享,希望大家一起探討解決。

 

首先是dockerfile的一些基本內容

#引入鏡像,低版本 docker 去掉  AS base
#換成別人做的阿里鏡像
#FROM registry.cn-hangzhou.aliyuncs.com/newbe36524
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base

#配置工作目錄 相當於cd
WORKDIR /app
  
#暴露容器端口,此端口與程序運行路徑一致,可
EXPOSE 80
  
#復制文件到工作目錄
COPY . .
 
#ENV :配置系統環境變量,比如程序環境環境等在這里配置(開發、預發、線上環境)
#這里是配置程序運行端口 如果程序不使用默認的80端口這里一定要設置(程序運行端口)
ENV ASPNETCORE_URLS http://+:80

#啟動程序 
ENTRYPOINT ["dotnet", "你的啟動項目名稱.dll"]

這個是從一位博主那兒摘來的,原文地址為:https://www.cnblogs.com/yiting/p/13388155.html

不過我現在粘貼的這部分,也是有做一些修改的。

然后接下來的內容,就是基於這個為原型,進行的添加。

注意這個dockerfile指的是,針對在vs中,用網站發布的方式生成的一系列文件后用的。並不是那種,使用git在linux系統某個文件夾里直接拉一整個項目,然后直接構建部署。vs默認給的dockerfile文件,就屬於這種。

 

1、dockerfile中的第一條:FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base,aspnet:3.1-buster-slim鏡像速度拉取非常慢的問題。

這個問題我到現在都是記憶猶新。那時候剛上手.net core,准備用docker發布一個試試的時候,就被這一句無情卡住。拉鏡像的時候速度非常非常慢,而且那個時候不知道這一句的意思其實拉鏡像,弄得百度都不知道怎么百。

這里我給第一次使用docker發布.net core的小伙伴解釋一下這個東西。

a、關於這個鏡像,他是只需要下載一次就夠了的,並不是每一次docker build都要重新下載。並且下完之后,你還能通過docker images命令找到這個鏡像的記錄。

b、如何加速?

  關於這個,小伙伴可以自行百度,搜索  aspnet:3.1-buster-slim國內鏡像 

  當然,這里我也給出一個方案。

  就是上面這個dockerfile里面的from改成別人做的阿里的鏡像(這個鏡像地址來源於https://www.newbe.pro/Mirrors/Mirrors-NetCore/

  這個制作方式,其實就是別人下載好了之后,上傳到自己的倉庫,然后把地址給出來,讓別人下載,所以這里我也無法保證地址的有效性。

 

2、docker 容器內的時區問題

容器內部的時間是按照美國來的,所以會存在一個時區問題。

解決辦法:

#設置時間為中國上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

將這三行加入到dockerfile中,然后重新構建image。

關於這三行命令該加在哪個位置,其實這個只要是放在 FROM 命令的下面,大致上都是不會有什么問題的。

 

3、docker容器中沒有vim / vi

在使用 docker exec -it [容器ID] /bin/bash 進入容器之后,會發現沒有了vim / vi

關於這個的話,百度很容易找到答案。

但是百度的答案前篇一律。先使用 docker exec -it [容器id] /bin/bash 命令進入容器后

apt-get update
apt-get install -y vim

 然后就成功安裝好了vim了(安裝vi 使用 apt-get install -y vi)

但是他們的都是進入容器后的操作,但我覺得這東西應該是在創建容器的時候,容器內部的debian系統,就直接就按照我的要求,裝好我要的東西。

所以關於這種需求,接下來則是需要在dockerfile中,加一句內容。

RUN apt-get update && apt-get install -y vim

實現方式還是很簡單的,添加一個RUN命令,然后update和install變成一句,使用 && 將兩個命令連成一句。

但是實際構建鏡像的時候,其實問題還是蠻多的。

在build的時候,你就會發現apt-get update這個命令奇慢無比,所以在這個時候,就是要將debian系統的源,指定為國內的源。

這個問題我也是花了幾天時間,試了好多好多別人給的源后,終於得出的結果(這一句命令,要放在 RUN apt-get update .... 之前)。

RUN sed -i 's#http://deb.debian.org#https://mirrors.aliyun.com#g' /etc/apt/sources.list

這一句命令來自於 https://blog.hidove.cn/post/750

我給大家分享一下,我解決這個問題的整個流程(如果上面這個命令對你無效的話,可以參考我的解決方式,自行尋找其他途徑)。

a、首先剛開始的時候,我也是按照正常思維來解決,就是直接百度 apt-get update速度慢,然后得出一大堆ubuntu系統的解決方案。

b、然后是注意到在容器里面執行apt-get update的時候,無意中看到了debian 字樣,然后我才知道,容器里面是debian系統。

c、接着就是想辦法知道debian系統的版本。(在容器內使用 cat /etc/issue ,可查看系統版本。 命令來源 https://blog.csdn.net/c461522756/article/details/70822234)

d、我這邊查到的debian 10,所以通過這個,去找的對應的國內源。

 

4、docker容器中安裝一些包

以安裝一個 system.drawing 命名空間下的方法要用到的 GDI+ 為例:

假設已經存在容器,則直接是 docker exec -it [容器id] /bin/bash  進入容器內部。如果容器創建之后從來沒有執行過 apt-get update ,則需要先執行 apt-get update ,然后再執行安裝命令。

apt-get install -y libgdiplus

 

當然,這個也是可以直接寫入到dockerfile 中,在每一次構建的時候,都直接裝好。

RUN apt-get update && apt-get install -y libgdiplus

 

 5、環境變量的設置,出現關鍵字沖突

正常情況下,如果我們想在容器里配置環境變量,都是會在Dockerfile中使用ENV進行設置,例如:

#設置環境為開發環境
ENV ASPNETCORE_ENVIRONMENT=Development

里面一共是兩種書寫格式:

 

 

 

 上面兩張圖,是來自編譯器的提示。

加入我想要設置一個環境變量,里面存儲的是mysql數據庫的連接字符串

ENV MysqlDb="Data Source=xxx.xxx.xxx.xxx;Database=test;User ID=root;Password=123456&;pooling=true;port=3306;sslMode=None;CharSet=utf8;"

則需要用雙引號把內容引起來,因為里面出現了 “=”

再接着,這里面還有一個問題,就是連接字符串里面的Password

里面有個字符 “&”

這個也是關鍵字,需要避免掉,否則你生成出來的docker容器里面。上面一句話,會讓你出現好幾個環境變量。

 

上面幾個問題解決完之后,最終的dockerfile文件為

#引入鏡像,低版本 docker 去掉  AS base
#換成別人做的阿里鏡像
#FROM registry.cn-hangzhou.aliyuncs.com/newbe36524
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base

#配置工作目錄 相當於cd
WORKDIR /app
  
#暴露容器端口,此端口與程序運行路徑一致,可
EXPOSE 80
  
#復制文件到工作目錄
COPY . .
 
#ENV :配置系統環境變量,比如程序環境環境等在這里配置(開發、預發、線上環境)
#這里是配置程序運行端口 如果程序不使用默認的80端口這里一定要設置(程序運行端口)
ENV ASPNETCORE_URLS http://+:80
#設置時間為中國上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#設置debian系統  
RUN sed -i 's#http://deb.debian.org#https://mirrors.aliyun.com#g' /etc/apt/sources.list  
RUN apt-get update && apt-get install -y vim && apt-get install -y libgdiplus

#啟動程序 
ENTRYPOINT [
"dotnet", "你的啟動項目名稱.dll"]

 


免責聲明!

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



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