Docker學(xué)習(xí)—DockerFile
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|??chaney1992
來(lái)源 |? urlify.cn/vqIFrm
66套java從入門(mén)到精通實(shí)戰(zhàn)課程分享
DockerFile是什么:
Dockerfile 是一個(gè)用來(lái)構(gòu)建鏡像的文本文件,Dockerfile內(nèi)容中包含了一條條構(gòu)建鏡像所需的指令和說(shuō)明。最終采用docker build 命令通過(guò)dockerfile中指令構(gòu)建鏡像
各種指令詳情:
1、From:指定基礎(chǔ)鏡像(dockerfile第一個(gè)指令)
FROM?[--platform=]??[AS?]
OR
FROM?[--platform=]?[:]?[AS?]
OR
FROM?[--platform=]?[@]?[AS?]
例如:
FROM?mysql:5.8
注意:
有效的
Dockerfile必須從FROM指令開(kāi)始ARG是Dockerfile中唯一可能位于FROM之前的指令
FROM可以在一個(gè)Dockerfile中多次出現(xiàn),以創(chuàng)建多個(gè)映像或?qū)⒁粋€(gè)構(gòu)建階段用作另一個(gè)構(gòu)建階段的依賴項(xiàng)
通過(guò)FROM指令添加AS name,可以選擇為新生成階段指定名稱(chēng)。該名稱(chēng)可以在后續(xù)的FROM和COPY--FROM=
指令中使用,以引用在此階段中構(gòu)建的鏡像。 標(biāo)記或摘要值是可選的
2、RUN:構(gòu)建鏡像時(shí)執(zhí)行的命令
兩種方式:
??RUN?<command>?????????????????????????????????##命令在shell中運(yùn)行,默認(rèn)情況下/bin/sh?-c在Linux或cmd?/S?/CWindows上運(yùn)行
??RUN?["executable",?"param1",?"param2"]??????##exec?方式
例如:
??RUN?["/bin/bash",?"-c",?"echo?hello"]
注意:
將在當(dāng)前圖像頂部的新層中執(zhí)行所有命令,并提交結(jié)果
在JSON格式中,必須轉(zhuǎn)義反斜杠。
例如:RUN ["c:\\windows\\system32\\tasklist.exe"]
3、CMD:構(gòu)建容器后調(diào)用,也就是在容器啟動(dòng)時(shí)才進(jìn)行調(diào)用。
三種格式:
????CMD?["executable","param1","param2"]??????????##執(zhí)行可執(zhí)行文件,優(yōu)先
????CMD?["param1","param2"]????????????????????????##設(shè)置了????ENTRYPOINT,則直接調(diào)用ENTRYPOINT添加參數(shù)
????CMD?command?param1?param2?????????????????????##執(zhí)行shell內(nèi)部命令
例如:
??CMD?["/usr/bin/wc","--help"]
注意:
CMD不同于RUN,CMD用于指定在容器啟動(dòng)時(shí)所要執(zhí)行的命令,而RUN用于指定鏡像構(gòu)建時(shí)所要執(zhí)行的命令。
在EXEC形式被解析為一個(gè)JSON陣列,這意味著必須使用雙引號(hào)(“)周?chē)脑挷粏我?hào)(')
4、LABEL:設(shè)置鏡像標(biāo)簽
添加(K-V)形式元數(shù)據(jù)到鏡像中,如果標(biāo)簽值中需要包含空格時(shí),需要設(shè)置引號(hào);反斜杠用于換號(hào)設(shè)置;示例如下:
LABEL?=?=?=?...例如:??LABEL?"com.example.vendor"="ACME?Incorporated"
??LABEL?com.example.label-with-value="foo"
??LABEL?version="1.0"
??LABEL?description="This?text?illustrates?\
??that?label-values?can?span multiple?lines."
注意:
鏡像中可以有多個(gè)LABLE,可以在一行指令中指定多個(gè)標(biāo)簽,如以下兩種格式:
LABEL?multi.label1="value1"?multi.label2="value2"?other="value3"
LABEL?multi.label1="value1"?\
??????multi.label2="value2"?\
??????other="value3"
可以繼承基礎(chǔ)鏡像中包含的的標(biāo)簽,如果標(biāo)簽已存在時(shí),但值不同;則最近設(shè)置的值將覆蓋以前的值
5、MAINTAINER(廢棄):設(shè)置生成鏡像的作者信息,可使用更加靈活的LABEL替代
MAINTAINER?
例如:
????MAINTAINER?
替代:
????LABEL?maintainer="abc"6、EXPOSE:指定容器運(yùn)行時(shí)監(jiān)聽(tīng)指定網(wǎng)絡(luò)端口;可以設(shè)置端口是TCP或UDP,默認(rèn)TCP;
語(yǔ)法:
??EXPOSE??[/...]
例如:
????EXPOSE?80/tcp
????EXPOSE?80/udp 注意:EXPOSE并不會(huì)讓容器的端口訪問(wèn)到主機(jī)。要使其可訪問(wèn),需要在docker?run運(yùn)行容器時(shí)通過(guò)-p來(lái)發(fā)布這些端口,或通過(guò)-P參數(shù)來(lái)發(fā)布EXPOSE導(dǎo)出的所有端口
7、ENV:設(shè)置環(huán)境變量
語(yǔ)法:ENV = ... ??##可以設(shè)置多個(gè)環(huán)境變量,如果key中包含空格,使用""進(jìn)行標(biāo)識(shí);反斜杠用于換行
?ENV????????##只能設(shè)置一個(gè)置,不推薦該寫(xiě)法
例如:
?ENV?MY_NAME="John?Doe"
?ENV?MY_DOG=Rex\?The\?Dog
?ENV?MY_CAT=fluffy
注意:
從生成的映像運(yùn)行容器時(shí),使用ENV設(shè)置的環(huán)境變量將保持不變。
修改ENV:docker run --env
=
8、ADD:將本地文件添加到容器中
ADD?[--chown=:]?...?????
ADD?[--chown=:]?["" ,...?"" ]?##包含空格的路徑時(shí),使用該方式
例如:
?ADD?test.txt?relativeDir/
?ADD?test.txt?/absoluteDir/ 注意:
--chown功能僅在用于構(gòu)建Linux容器的Dockerfiles上受支持,而在Windows容器上不起作用src可以指定讀個(gè)資源,但是如果它們是文件或目錄,則將其路徑解釋為相對(duì)于構(gòu)建上下文源的路徑。
src支持通配符,匹配規(guī)則采用Go的?filepath.Match規(guī)則完成
目錄本身不被復(fù)制,僅其內(nèi)容被復(fù)制。
如果
是以公認(rèn)的壓縮格式(身份,gzip,bzip2或xz)作為本地tar歸檔文件,則將其解壓縮為目錄,來(lái)自遠(yuǎn)程URL的資源不會(huì)被解壓縮。如果
直接或由于使用通配符而指定了多個(gè)資源,則該資源必須是目錄,并且必須以斜杠結(jié)尾/如果
不以斜杠結(jié)尾,則將其視為常規(guī)文件,并將其內(nèi)容寫(xiě)入如果
不存在,它將與路徑中所有缺少的目錄一起創(chuàng)建
9、COPY:復(fù)制文件到容器指定目錄
COPY?[--chown=:]?...?
COPY?[--chown=:]?["" ,...?"" ]
例如:
?COPY?test.txt?/absoluteDir/
?COPY?test.txt?relativeDir/
注意:同ADD指令差不多,區(qū)別為以下內(nèi)容
不會(huì)自動(dòng)解壓文件,也不能訪問(wèn)網(wǎng)絡(luò)資源
src不能為網(wǎng)絡(luò)資源
10、ENTRYPOINT:配置容器,使其可執(zhí)行化
ENTRYPOINT?["executable",?"param1",?"param2"]????##(可執(zhí)行文件,?優(yōu)先)
ENTRYPOINT?command?param1?param2????????????##(shell內(nèi)部命令)
例如:
ENTRYPOINT?["top",?"-b"]CMD和ENTRYPOINT相互作用
Dockerfile應(yīng)至少指定
CMD或ENTRYPOINT命令之一。ENTRYPOINT?使用容器作為可執(zhí)行文件時(shí)應(yīng)定義。CMD應(yīng)該用作ENTRYPOINT在容器中定義命令或執(zhí)行臨時(shí)命令的默認(rèn)參數(shù)的方式。CMD?當(dāng)使用替代參數(shù)運(yùn)行容器時(shí),將被覆蓋。
11、VOLUME:指定持久化目錄
VOLUME?["/data"]
例如:
?VOLUME?["/var/www",?"/var/log/apache2",?"/etc/apache2"]?
注意:
一個(gè)卷可以存在于一個(gè)或多個(gè)容器的指定目錄,該目錄可以繞過(guò)聯(lián)合文件系統(tǒng),并具有以下功能:
卷可以容器間共享和重用
容器并不一定要和其它容器共享卷
修改卷后會(huì)立即生效
對(duì)卷的修改不會(huì)對(duì)鏡像產(chǎn)生影響
卷會(huì)一直存在,直到?jīng)]有任何容器在使用它
基于Windows的容器上的卷:使用基于Windows的容器時(shí):除C盤(pán)目錄、不存在或空目錄
從Dockerfile中更改卷:如果在聲明了卷之后有任何構(gòu)建步驟更改了卷中的數(shù)據(jù),則這些更改將被丟棄。
SON格式:列表被解析為JSON數(shù)組。您必須用雙引號(hào)(
")而不是單引號(hào)(')括住單詞。
12、USER:指定運(yùn)行容器時(shí)的用戶名或 UID,后續(xù)的 RUN 也會(huì)使用指定用戶
USER?[:]
or
USER?[:]
注意:
使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。
鏡像構(gòu)建完成后,通過(guò)
docker run運(yùn)行容器時(shí),可以通過(guò)-u參數(shù)來(lái)覆蓋所指定的用戶。當(dāng)服務(wù)不需要管理員權(quán)限時(shí),可以通過(guò)該命令指定運(yùn)行用戶。并且可以在之前創(chuàng)建所需要的用戶
13、WORKDIR:設(shè)置工作目錄
WORKDIR /path/to/workdir?
? 注意:
通過(guò)WORKDIR設(shè)置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會(huì)在該目錄下執(zhí)行。在使用
docker run運(yùn)行容器時(shí),可以通過(guò)-w參數(shù)覆蓋構(gòu)建時(shí)所設(shè)置的工作目錄。
14、ARG:構(gòu)建參數(shù)
ARG?[=]
例如:
?ARG?user1=someuser
?ARG?buildno=1? ? 注意:
ARG 設(shè)置的環(huán)境變量?jī)H對(duì) Dockerfile 內(nèi)有效
不建議使用構(gòu)建變量傳遞敏感信息,構(gòu)建變量值在docker history 可以查看
內(nèi)置Arg變量:
HTTP_PROXYhttp_proxyHTTPS_PROXYhttps_proxyFTP_PROXYftp_proxyNO_PROXYno_proxy
15、ONBUILD:設(shè)置鏡像觸發(fā)器
ONBUILD?
例如:
?ONBUILD?ADD?.?/app/src
?ONBUILD?RUN?/usr/local/bin/python-build?--dir?/app/src?
注意:
不允許
ONBUILD使用鏈接說(shuō)明ONBUILD ONBUILDONBUILD指令可能不會(huì)觸發(fā)FROM或MAINTAINER指令
16、STOPSIGNAL:?STOPSIGNAL指令設(shè)置將發(fā)送到容器以退出的系統(tǒng)調(diào)用信號(hào)
STOPSIGNAL signal17、HEALTHCHECK:指定某個(gè)程序或者指令來(lái)監(jiān)控 docker 容器服務(wù)的運(yùn)行狀態(tài)。
兩種形式:
??HEALTHCHECK?[OPTIONS]?CMD?command???(通過(guò)在容器內(nèi)部運(yùn)行命令來(lái)檢查容器運(yùn)行狀況)
??HEALTHCHECK?NONE?????????????(禁用從基映像繼承的任何運(yùn)行狀況檢查)
例如:
??HEALTHCHECK?--interval=5m?--timeout=3s?\
????CMD?curl?-f?http://localhost/?||?exit?1
注意:
HEALTHCHECKDockerfile中只能有一條指令。如果您列出多個(gè),則只有最后一個(gè)HEALTHCHECK才會(huì)生效。
18、SHELL:允許重寫(xiě)命令的SHELL形式所使用的默認(rèn)SHELL。Linux上的默認(rèn)shell為[“/bin/sh”、“-c”];Windows上的默認(rèn)shell為[“cmd”、“/S”、“/c”]
語(yǔ)法:
??SHELL?["executable",?"parameters"]
例如:
??SHELL?["powershell",?"-command"]注意:
SHELL可以出現(xiàn)多次。每個(gè)SHELL指令將覆蓋所有先前的SHELL指令,并影響所有后續(xù)的指令SHELL指令在Windows上特別有用,在Windows上有兩個(gè)常用且完全不同的本機(jī)shell:cmd和powershell
DockerFile示例:
#設(shè)置基礎(chǔ)鏡像
FROM?mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim?AS?base
#設(shè)置工作目錄WORKDIR?/app
#設(shè)置監(jiān)聽(tīng)端口EXPOSE?80
#設(shè)置鏡像
FROM?mcr.microsoft.com/dotnet/core/sdk:3.1-buster?AS?build#設(shè)置工作目錄
WORKDIR?/src#復(fù)制文件夾
COPY?["cz.IdentityServer/cz.IdentityServer.csproj",?"cz.IdentityServer/"]
#執(zhí)行項(xiàng)目還原命令RUN?dotnet?restore?"cz.IdentityServer/cz.IdentityServer.csproj"
#復(fù)制文件COPY?.?.
WORKDIR?"/src/cz.IdentityServer"#執(zhí)行編譯項(xiàng)目命令
RUN?dotnet?build?"cz.IdentityServer.csproj"?-c?Release?-o?/app/build
#執(zhí)行發(fā)布項(xiàng)目
FROM?build?AS?publish
RUN?dotnet?publish?"cz.IdentityServer.csproj"?-c?Release?-o?/app/publish
FROM?base?AS?final
WORKDIR?/app#復(fù)制發(fā)布內(nèi)容到docker目錄
COPY?--from=publish?/app/publish?.#啟動(dòng)項(xiàng)目
ENTRYPOINT?["dotnet",?"cz.IdentityServer.dll"]
參考:https://docs.docker.com/engine/reference/builder/
粉絲福利:實(shí)戰(zhàn)springboot+CAS單點(diǎn)登錄系統(tǒng)視頻教程免費(fèi)領(lǐng)取
???
?長(zhǎng)按上方微信二維碼?2 秒 即可獲取資料
感謝點(diǎn)贊支持下哈?
