DockerFile是什麼:
Dockerfile 是一個用來建構鏡像的文本檔案,Dockerfile内容中包含了一條條建構鏡像所需的指令和說明。最終采用docker build 指令通過dockerfile中指令建構鏡像
各種指令詳情:
1、From:指定基礎鏡像(dockerfile第一個指令)
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
注意:
- 有效的Dockerfile必須從FROM指令開始
- ARG是Dockerfile中唯一可能位于FROM之前的指令
- FROM可以在一個Dockerfile中多次出現,以建立多個映像或将一個建構階段用作另一個建構階段的依賴項
- 通過FROM指令添加AS name,可以選擇為新生成階段指定名稱。該名稱可以在後續的FROM和COPY--FROM=<name>指令中使用,以引用在此階段中建構的鏡像。
- 标記或摘要值是可選的
2、RUN:建構鏡像時執行的指令
兩種方式:
RUN <command> ##指令在shell中運作,預設情況下/bin/sh -c在Linux或cmd /S /CWindows上運作
RUN ["executable", "param1", "param2"] ##exec 方式
例如:
RUN ["/bin/bash", "-c", "echo hello"]
- 将在目前圖像頂部的新層中執行所有指令,并送出結果
- 在JSON格式中,必須轉義反斜杠。
例如:RUN ["c:\\windows\\system32\\tasklist.exe"]
3、CMD:建構容器後調用,也就是在容器啟動時才進行調用。
三種格式:
CMD ["executable","param1","param2"] ##執行可執行檔案,優先
CMD ["param1","param2"] ##設定了 ENTRYPOINT,則直接調用ENTRYPOINT添加參數
CMD command param1 param2 ##執行shell内部指令
例如:
CMD ["/usr/bin/wc","--help"]
注意:
- CMD不同于RUN,CMD用于指定在容器啟動時所要執行的指令,而RUN用于指定鏡像建構時所要執行的指令。
- 在EXEC形式被解析為一個JSON陣列,這意味着必須使用雙引号(“)周圍的話不單引号(')
4、LABEL:設定鏡像标簽
添加(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."
- 鏡像中可以有多個LABLE,可以在一行指令中指定多個标簽,如以下兩種格式:
LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
- 可以繼承基礎鏡像中包含的的标簽,如果标簽已存在時,但值不同;則最近設定的值将覆寫以前的值
5、MAINTAINER(廢棄):設定生成鏡像的作者資訊,可使用更加靈活的LABEL替代
MAINTAINER <name>
例如:
MAINTAINER <name>
替代:
LABEL maintainer="abc"
6、EXPOSE:指定容器運作時監聽指定網絡端口;可以設定端口是TCP或UDP,預設TCP;
文法:
EXPOSE <port> [<port>/<protocol>...]
例如:
EXPOSE 80/tcp
EXPOSE 80/udp
注意:EXPOSE并不會讓容器的端口通路到主機。要使其可通路,需要在docker run運作容器時通過-p來釋出這些端口,或通過-P參數來釋出EXPOSE導出的所有端口
7、ENV:設定環境變量
文法:ENV <key>=<value> ... ##可以設定多個環境變量,如果key中包含空格,使用""進行辨別;反斜杠用于換行
ENV <key> <value> ##隻能設定一個置,不推薦該寫法
例如:
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
- 從生成的映像運作容器時,使用ENV設定的環境變量将保持不變。
- 修改ENV:docker run --env <key>=<value>
8、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可以指定讀個資源,但是如果它們是檔案或目錄,則将其路徑解釋為相對于建構上下文源的路徑。
- src支援通配符,比對規則采用Go的 filepath.Match規則完成
- 目錄本身不被複制,僅其内容被複制。
- 如果<src>是以公認的壓縮格式(身份,gzip,bzip2或xz)作為本地tar歸檔檔案,則将其解壓縮為目錄,來自遠端URL的資源不會被解壓縮。
- 如果<src>直接或由于使用通配符而指定了多個資源,則該資源<dest>必須是目錄,并且必須以斜杠結尾/
- 如果<dest>不以斜杠結尾,則将其視為正常檔案,并将其内容<src>寫入<dest>
- 如果<dest>不存在,它将與路徑中所有缺少的目錄一起建立
9、COPY:複制檔案到容器指定目錄
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
例如:
COPY test.txt /absoluteDir/
COPY test.txt relativeDir/
注意:同ADD指令差不多,差別為以下内容
- 不會自動解壓檔案,也不能通路網絡資源
- src不能為網絡資源
10、ENTRYPOINT:配置容器,使其可執行化
ENTRYPOINT ["executable", "param1", "param2"] ##(可執行檔案, 優先)
ENTRYPOINT command param1 param2 ##(shell内部指令)
例如:
ENTRYPOINT ["top", "-b"]
CMD和ENTRYPOINT互相作用
- Dockerfile應至少指定CMD或ENTRYPOINT指令之一。
- ENTRYPOINT 使用容器作為可執行檔案時應定義。
- CMD應該用作ENTRYPOINT在容器中定義指令或執行臨時指令的預設參數的方式。
- CMD 當使用替代參數運作容器時,将被覆寫。
11、VOLUME:指定持久化目錄
VOLUME ["/data"]
例如:
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
- 一個卷可以存在于一個或多個容器的指定目錄,該目錄可以繞過聯合檔案系統,并具有以下功能:
- 卷可以容器間共享和重用
- 容器并不一定要和其它容器共享卷
- 修改卷後會立即生效
- 對卷的修改不會對鏡像産生影響
- 卷會一直存在,直到沒有任何容器在使用它
- 基于Windows的容器上的卷:使用基于Windows的容器時:除C槽目錄、不存在或空目錄
- 從Dockerfile中更改卷:如果在聲明了卷之後有任何建構步驟更改了卷中的資料,則這些更改将被丢棄。
- SON格式:清單被解析為JSON數組。您必須用雙引号(")而不是單引号(')包覆單詞。
12、USER:指定運作容器時的使用者名或 UID,後續的 RUN 也會使用指定使用者
USER <user>[:<group>]
or
USER <UID>[:<GID>]
- 使用USER指定使用者後,Dockerfile中其後的指令RUN、CMD、ENTRYPOINT都将使用該使用者。
- 鏡像建構完成後,通過docker run運作容器時,可以通過-u參數來覆寫所指定的使用者。
- 當服務不需要管理者權限時,可以通過該指令指定運作使用者。并且可以在之前建立所需要的使用者
13、WORKDIR:設定工作目錄
WORKDIR /path/to/workdir
注意:
-
通過WORKDIR設定工作目錄後,Dockerfile中其後的指令RUN、CMD、ENTRYPOINT、ADD、COPY等指令都會在該目錄下執行。
-
在使用docker run運作容器時,可以通過-w參數覆寫建構時所設定的工作目錄。
14、ARG:建構參數
ARG <name>[=<default value>]
例如:
ARG user1=someuser
ARG buildno=1
- ARG 設定的環境變量僅對 Dockerfile 内有效
- 不建議使用建構變量傳遞敏感資訊,建構變量值在docker history 可以檢視
- 内置Arg變量:
- HTTP_PROXY
- http_proxy
- HTTPS_PROXY
- https_proxy
- FTP_PROXY
- ftp_proxy
- NO_PROXY
- no_proxy
15、ONBUILD:設定鏡像觸發器
ONBUILD <INSTRUCTION>
例如:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
- 不允許ONBUILD使用連結說明ONBUILD ONBUILD
- ONBUILD指令可能不會觸發FROM或MAINTAINER指令
16、STOPSIGNAL: STOPSIGNAL指令設定将發送到容器以退出的系統調用信号
STOPSIGNAL signal
17、HEALTHCHECK:指定某個程式或者指令來監控 docker 容器服務的運作狀态。
兩種形式:
HEALTHCHECK [OPTIONS] CMD command (通過在容器内部運作指令來檢查容器運作狀況)
HEALTHCHECK NONE (禁用從基映像繼承的任何運作狀況檢查)
例如:
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
- HEALTHCHECKDockerfile中隻能有一條指令。如果您列出多個,則隻有最後一個HEALTHCHECK才會生效。
18、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
DockerFile示例:
#設定基礎鏡像
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/