Dockerfile文檔編寫


圖片顯示問題,附上有道雲筆記中鏈接:http://note.youdao.com/noteshare?id=fba6d2f53fd6447ba32c3b7accfeb89b&sub=B36B5904A0804AF5AD3194AAA196F8C3

編寫Dockerfile

FROM指令和MAINTAINER指令

腳本的第1行是FROM指令。通過FROM指令,docker編譯程序能夠知道在哪個基礎鏡像執行來進行編譯。所有的Dockerfile都必須以FROM指令開始。第二條指令MAINTAINER,用來標明這個鏡像的維護者信息。

RUN指令

接下來是RUN指令。這條指令用來在docker的編譯環境中運行指定命令。上面這條指令會在編譯環境運行/bin/sh -c "apt-get update && apt-get -y install ..."RUN指令還有另外一種格式:

RUN ["程序名", "參數1", "參數2"]

這種格式運行程序,可以免除運行/bin/sh的消耗。這種格式使用Json格式將程序名與所需參數組成一個字符串數組,所以如果參數中有引號等特殊字符,需要進行轉義。

ENV指令

ENV指令用來指定在執行docker run命令運行鏡像時,自動設置的環境變量。這些環境變量可以通過docker run命令的--evn參數來進行修改。

COPY指令和ADD指令

COPY指令用來將本地(Dockerfile所在位置)的文件或文件夾復制到編譯環境的指定路徑下。上面的例子里,boot2docker的Dockerfile希望將與Dockerfile同一目錄下的kernel_config文件復制到編譯環境的/linux-kernal/.config。Dockerfile還提供了另外一個類似的指令:ADD。在復制文件方面ADD指令和COPY指令的格式和效果是完全一樣的。這兩個指令的區別主要由兩點:

  1. ADD指令可以從一個URL地址下載內容復制到容器的文件系統中;
  2. ADD指令會將壓縮打包格式的文件解開后復制到指定位置,而COPY指令只做復制操作。

CMD指令

這是整個Dockerfile腳本的最后一條指令。當Dockerfile已經完成了所有環境的安裝與配置,通過CMD指令來指示docker run命令運行鏡像時要執行的命令。上面的例子里,在完成所有工作后,boot2docker的編譯腳本將編譯結果輸出到本地環境下。

其他指令

上面我們通過boot2docker的Dockerfile腳本學習了幾個最常用的指令。接下來我們再學習剩下的幾個指令。

EXPOSE指令

EXPOSE <端口> [<端口>...]指令用於標明,這個鏡像中的應用將會偵聽某個端口,並且希望能將這個端口映射到主機的網絡界面上。但是,為了安全,docker run命令如果沒有帶上響應的端口映射參數,docker並不會將端口映射出了。

ENTRYPOINT指令

ENTRYPOINT指令和前面介紹過的CMD一樣,用於標明一個鏡像作為容器運行時,最后要執行的程序或命令。這兩個指令有相同之處,也有區別。通過兩個指令的配合使用可以配置出不同的效果。

ENTRYPOINT指令有兩種格式,CMD指令有三種格式:

ENTRYPOINT ["程序名", "參數1", "參數2"]
ENTRYPOINT 命令 參數1 參數2

CMD ["程序名", "參數1", "參數2"]
CMD 命令 參數1 參數2
CMD 參數1 參數2

ENTRYPOINT是容器運行程序的入口。也就是說,在docker run命令中指定的命令都將作為參數提供給ENTRYPOINT指定的程序。同樣,上面列舉的CMD指令格式的后面兩種格式也將作為參數提供給ENTRYPOINT指定的程序。

默認的ENTRYPOINT/bin/sh -c。你可以根據實際需要任意設置。但是如果在一個Dockerfile中出現了多個ENTRYPOINT指令,那么,只有最后一個ENTRYPOINT指令是起效的。

一種常用的設置是將命令與必要參數設置到ENTRYPOINT中,而運行時只提供其他選項。例如:你有一個MySQL的客戶端程序運行在容器中,而客戶端所需要的主機地址、用戶名和密碼你不希望每次都輸入,你就可以將ENTRYPOINT設置成:ENTRYPOINT mysql -u <用戶名> -p <密碼> -h <主機名>。而你運行時,只需要指定數據庫名。

VOLUME指令

VOLUME ["路徑"]

VOLUME指令用於在容器內創建一個或多個卷。而更多的時候,是在執行docker run時指定要創建的卷以及本地路徑來進行映射。關於這個用法將在后面的章節學習到。

USER指令

USER 用戶名或用戶ID

USER指令用於容器內運行RUN指令或CMD指令的用戶。例如,在構建一個nginx鏡像時,你希望最后運行nginx的用戶為nginx,就可以在CMD ["nginx"]之前將用戶設置為nginx

如果在運行docker run命令時設置了-u 用戶名參數,那么將覆蓋USER指令設置的用戶。

WORKDIR指令

WORKDIR 路徑

WORKDIR指令用於設置執行RUN指令、CMD指令和ENTRYPOINT指令執行時的工作目錄。在Dockerfile中可以多次設置WORKDIR,在每次設置之后的命令將使用新的路徑。

ONBUILD指令

ONBUILD 指令

ONBUILD指令用於設置一些指令,當本鏡像作為基礎鏡像被其他Dockerfile用FROM指令引用時,在所有其他指令執行之前先執行這些指令。

備注

舉例說明 ENTRYPOINTCMD的區別

  • dockerfile 中只有CMD ["cat","/etc/passwd"],啟動docker
docker run -itd --name docker_name docker_image 

以上啟動docker后,會直接執行cat /etc/passwd.和直接執行

docker run -itd --name docker_name docker_image cat /etc/passwd
  • dockerfile 中只有ENTRYPOINT ['cat'],啟動docker
docker run -itd --name docker_name docker_image  /etc/passwd

以上啟動docker后,會直接執行cat /etc/passwd.

  • dockerfile 中有ENTRYPOINT ["cat"]CMD ["/etc/passwd"] ,啟動docker
docker run -itd --name docker_name docker_image 

以上啟動docker后,會直接執行cat /etc/passwd.
如果在啟動命令后在加入其他參數

docker run -itd --name docker_name docker_image  cat /etc/shadow

實際會執行: cat /etc/passwd cat /etc/shadow .這樣就是錯誤的

示例講解

Dockerfile

FROM hub.geovis.io/isphere/ubuntu:18.04_ali  ##基礎鏡像

RUN mkdir -p /opt/app/ \    ##容器中創建 /opt/app和/nfs/data兩個文件夾
    mkdir -p /nfs/data/ \

WORKDIR /opt/app/    ## 切換到/opt/app下,一下命令會在/opt/app下執行

COPY requirements.txt /opt/app   ## 將本地的requirements.txt文檔拷貝到容器的/opt/app下


RUN \
    pip3 install -r requirements.txt   ## 執行命令,安裝依賴包

COPY . /opt/app/  ## 將本地其他相關文件拷貝到容器/opt/app下

EXPOSE 5000  ## 容器申請端口5000

ENTRYPOINT ["python3"]

CMD ["-m", "swagger_server"]   ##docker run時,會直接執行 python3 -m swagger_server

本地目錄結構

打包命令

在Dockerfile的目錄下執行

docker build -t dockerimage:tag  .


免責聲明!

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



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