上一篇文章簡單使用了docker 拉取鏡像、啓動容器、編譯鏡像;其中編譯鏡像時,使用到了Dockerfile,那麼接下來咱們就詳細的來講說Dockerfilehtml
Dockerfile 是一個用來構建鏡像的文本文件,Dockerfile內容中包含了一條條構建鏡像所需的指令和說明。最終採用docker build 命令經過dockerfile中指令構建鏡像python
一、From:指定基礎鏡像(dockerfile第一個指令)mysql
FROM [--platform=<platform>] <image> [AS <name>] OR FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] OR FROM [--platform=<platform>] <image>[@<digest>] [AS <name>] 例如: FROM mysql:5.8
注意:golang
Dockerfile
必須從FROM
指令開始二、RUN:構建鏡像時執行的命令sql
兩種方式: RUN <command> ##命令在shell中運行,默認狀況下/bin/sh -c在Linux或cmd /S /CWindows上運行 RUN ["executable", "param1", "param2"] ##exec 方式 例如: RUN ["/bin/bash", "-c", "echo hello"]
注意:docker
例如:RUN ["c:\\windows\\system32\\tasklist.exe"]
三、CMD:構建容器後調用,也就是在容器啓動時才進行調用。shell
三種格式: CMD ["executable","param1","param2"] ##執行可執行文件,優先 CMD ["param1","param2"] ##設置了 ENTRYPOINT,則直接調用ENTRYPOINT添加參數 CMD command param1 param2 ##執行shell內部命令 例如: CMD ["/usr/bin/wc","--help"]
注意:
apache
四、LABEL:設置鏡像標籤windows
添加(K-V)形式元數據到鏡像中,若是標籤值中須要包含空格時,須要設置引號;反斜槓用於換號設置;示例以下:數組
LABEL <key>=<value> <key>=<value> <key>=<value> ...
例如:
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."
注意:
LABEL multi.label1="value1" multi.label2="value2" other="value3" LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3"
五、MAINTAINER(廢棄):設置生成鏡像的做者信息,可以使用更加靈活的LABEL替代
MAINTAINER <name> 例如: MAINTAINER <name> 替代: LABEL maintainer="abc"
六、EXPOSE:指定容器運行時監聽指定網絡端口;能夠設置端口是TCP或UDP,默認TCP;
語法:
EXPOSE <port> [<port>/<protocol>...] 例如: EXPOSE 80/tcp EXPOSE 80/udp
注意:EXPOSE並不會讓容器的端口訪問到主機。要使其可訪問,須要在docker run
運行容器時經過-p來發布這些端口,或經過-P
參數來發布EXPOSE導出的全部端口
七、ENV:設置環境變量
語法:
ENV <key>=<value> ... ##能夠設置多個環境變量,若是key中包含空格,使用""進行標識;反斜槓用於換行 ENV <key> <value> ##只能設置一個置,不推薦該寫法 例如: ENV MY_NAME="John Doe" ENV MY_DOG=Rex\ The\ Dog ENV MY_CAT=fluffy
注意:
八、ADD:將本地文件添加到容器中
ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] ##包含空格的路徑時,使用該方式 例如: ADD test.txt relativeDir/ ADD test.txt /absoluteDir/
注意:
--chown
功能僅在用於構建Linux容器的Dockerfiles上受支持,而在Windows容器上不起做用<src>
是以公認的壓縮格式(身份,gzip,bzip2或xz)做爲本地tar歸檔文件,則將其解壓縮爲目錄,來自遠程URL的資源不會被解壓縮。<src>
直接或因爲使用通配符而指定了多個資源,則該資源<dest>
必須是目錄,而且必須以斜槓結尾/
<dest>
不以斜槓結尾,則將其視爲常規文件,並將其內容<src>
寫入<dest>
<dest>
不存在,它將與路徑中全部缺乏的目錄一塊兒建立九、COPY:複製文件到容器指定目錄
COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] 例如: COPY test.txt /absoluteDir/ COPY test.txt relativeDir/
注意:同ADD指令差很少,區別爲如下內容
十、ENTRYPOINT:配置容器,使其可執行化
ENTRYPOINT ["executable", "param1", "param2"] ##(可執行文件, 優先) ENTRYPOINT command param1 param2 ##(shell內部命令) 例如: ENTRYPOINT ["top", "-b"]
CMD和ENTRYPOINT相互做用
Dockerfile應至少指定CMD
或ENTRYPOINT
命令之一。
ENTRYPOINT
使用容器做爲可執行文件時應定義。
CMD
應該用做ENTRYPOINT
在容器中定義命令或執行臨時命令的默認參數的方式。
CMD
當使用替代參數運行容器時,將被覆蓋。
十一、VOLUME:指定持久化目錄
VOLUME ["/data"] 例如: VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
注意:
"
)而不是單引號('
)括住單詞。十二、USER:指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶
USER <user>[:<group>]
or
USER <UID>[:<GID>]
注意:
docker run
運行容器時,能夠經過-u參數來覆蓋所指定的用戶。1三、WORKDIR:設置工做目錄
WORKDIR /path/to/workdir
注意:
經過WORKDIR設置工做目錄後,Dockerfile中其後的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執行。
在使用運行容器時,能夠經過-w參數覆蓋構建時所設置的工做目錄。docker run
1四、ARG:構建參數
ARG <name>[=<default value>] 例如: ARG user1=someuser ARG buildno=1
注意:
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy
1五、ONBUILD:設置鏡像觸發器
ONBUILD <INSTRUCTION> 例如: ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注意:
ONBUILD
使用連接說明ONBUILD ONBUILD
ONBUILD
指令可能不會觸發FROM
或MAINTAINER
指令1六、STOPSIGNAL: STOPSIGNAL指令設置將發送到容器以退出的系統調用信號
STOPSIGNAL signal
1七、HEALTHCHECK:指定某個程序或者指令來監控 docker 容器服務的運行狀態。
兩種形式: HEALTHCHECK [OPTIONS] CMD command (經過在容器內部運行命令來檢查容器運行情況) HEALTHCHECK NONE (禁用從基映像繼承的任何運行情況檢查) 例如: HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1
注意:
HEALTHCHECK
Dockerfile中只能有一條指令。若是您列出多個,則只有最後一個HEALTHCHECK
纔會生效。
1八、SHELL:容許重寫命令的SHELL形式所使用的默認SHELL。Linux上的默認shell爲[「/bin/sh」、「-c」];Windows上的默認shell爲[「cmd」、「/S」、「/c」]
語法:
SHELL ["executable", "parameters"] 例如: SHELL ["powershell", "-command"]
注意:
SHELL
能夠出現屢次。每一個SHELL
指令將覆蓋全部先前的SHELL
指令,並影響全部後續的指令SHELL
指令在Windows上特別有用,在Windows上有兩個經常使用且徹底不一樣的本機shell:cmd
和powershell
#設置基礎鏡像 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base #設置工做目錄
WORKDIR /app #設置監聽端口
EXPOSE 80
#設置鏡像 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
#設置工做目錄 WORKDIR /src
#複製文件夾 COPY ["cz.IdentityServer/cz.IdentityServer.csproj", "cz.IdentityServer/"] #執行項目還原命令
RUN dotnet restore "cz.IdentityServer/cz.IdentityServer.csproj" #複製文件
COPY . . WORKDIR "/src/cz.IdentityServer"
#執行編譯項目命令 RUN dotnet build "cz.IdentityServer.csproj" -c Release -o /app/build #執行發佈項目 FROM build AS publish RUN dotnet publish "cz.IdentityServer.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app
#複製發佈內容到docker目錄 COPY --from=publish /app/publish .
#啓動項目 ENTRYPOINT ["dotnet", "cz.IdentityServer.dll"]
參考:https://docs.docker.com/engine/reference/builder/