Docker學習—DockerFile

  • 前言:

 上一篇文章簡單使用了docker 拉取鏡像、啓動容器、編譯鏡像;其中編譯鏡像時,使用到了Dockerfile,那麼接下來咱們就詳細的來講說Dockerfilehtml

DockerFile是什麼:

  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指令開始
  • ARG是Dockerfile中惟一可能位於FROM以前的指令
  • FROM能夠在一個Dockerfile中屢次出現,以建立多個映像或將一個構建階段用做另外一個構建階段的依賴項
  • 經過FROM指令添加AS name,能夠選擇爲新生成階段指定名稱。該名稱能夠在後續的FROM和COPY--FROM=<name>指令中使用,以引用在此階段中構建的鏡像。
  • 標記或摘要值是可選的

二、RUN:構建鏡像時執行的命令sql

兩種方式:
  RUN <command>                                 ##命令在shell中運行,默認狀況下/bin/sh -c在Linux或cmd /S /CWindows上運行
  RUN ["executable", "param1", "param2"]      ##exec 方式
例如:
  RUN ["/bin/bash", "-c", "echo hello"]

 注意:docker

  • 將在當前圖像頂部的新層中執行全部命令,並提交結果
  • JSON格式中,必須轉義反斜槓。
      例如: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

  • CMD不一樣於RUN,CMD用於指定在容器啓動時所要執行的命令,而RUN用於指定鏡像構建時所要執行的命令。
  • EXEC形式被解析爲一個JSON陣列,這意味着必須使用雙引號(「)周圍的話不單引號(')

四、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."

 注意:

  • 鏡像中能夠有多個LABLE,能夠在一行指令中指定多個標籤,如如下兩種格式:
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

 注意:

  • 從生成的映像運行容器時,使用ENV設置的環境變量將保持不變。
  • 修改ENV:docker run --env <key>=<value>

八、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>不存在,它將與路徑中全部缺乏的目錄一塊兒建立

九、COPY:複製文件到容器指定目錄

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
例如:
 COPY test.txt /absoluteDir/
 COPY test.txt relativeDir/

 

 注意:同ADD指令差很少,區別爲如下內容

  • 不會自動解壓文件,也不能訪問網絡資源
  • src不能爲網絡資源

十、ENTRYPOINT:配置容器,使其可執行化

ENTRYPOINT ["executable", "param1", "param2"]    ##(可執行文件, 優先)
ENTRYPOINT command param1 param2            ##(shell內部命令)
例如:
ENTRYPOINT ["top", "-b"]

 CMD和ENTRYPOINT相互做用

  1. Dockerfile應至少指定CMDENTRYPOINT命令之一。

  2. ENTRYPOINT 使用容器做爲可執行文件時應定義。

  3. CMD應該用做ENTRYPOINT在容器中定義命令或執行臨時命令的默認參數的方式

  4. CMD 當使用替代參數運行容器時,將被覆蓋。  

十一、VOLUME:指定持久化目錄

VOLUME ["/data"]
例如:
 VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] 

 

 注意:

  • 一個卷能夠存在於一個或多個容器的指定目錄,該目錄能夠繞過聯合文件系統,並具備如下功能:
    • 卷能夠容器間共享和重用
    • 容器並不必定要和其它容器共享卷
    • 修改卷後會當即生效
    • 對卷的修改不會對鏡像產生影響
    • 卷會一直存在,直到沒有任何容器在使用它
  • 基於Windows的容器上的卷:使用基於Windows的容器時:除C盤目錄、不存在或空目錄
  • 從Dockerfile中更改卷:若是在聲明瞭卷以後有任何構建步驟更改了卷中的數據,則這些更改將被丟棄。
  • SON格式:列表被解析爲JSON數組。您必須用雙引號(")而不是單引號('括住單詞

十二、USER:指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶

USER <user>[:<group>]
or
USER <UID>[:<GID>]

 

 注意:

  • 使用USER指定用戶後,Dockerfile中其後的命令RUN、CMD、ENTRYPOINT都將使用該用戶。
  • 鏡像構建完成後,經過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 

  注意:

  • ARG 設置的環境變量僅對 Dockerfile 內有效
  • 不建議使用構建變量傳遞敏感信息,構建變量值在docker history 能夠查看
  • 內置Arg變量:
    • 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指令可能不會觸發FROMMAINTAINER指令

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

 注意:

  • HEALTHCHECKDockerfile中只能有一條指令。若是您列出多個,則只有最後一個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:cmdpowershell

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/

相關文章
相關標籤/搜索