圖片顯示問題,附上有道雲筆記中鏈接: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
指令的格式和效果是完全一樣的。這兩個指令的區別主要由兩點:
ADD
指令可以從一個URL地址下載內容復制到容器的文件系統中;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
指令引用時,在所有其他指令執行之前先執行這些指令。
備注
舉例說明 ENTRYPOINT
和CMD
的區別
- 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 .