圖片顯示問題,附上有道云筆記中鏈接: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 .
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/45389.html
標籤:其他
下一篇:大神過來看看,上網行為管理設備
