cmd该清华镜像_Docker动手教程3.3:容器镜像构建2
內容摘要
Dockerfile 常用指令
前面初步講解了Dockerfile,這節詳細介紹Dockerfile用到的指令和語法。
下面來看一個較為完整的Dockerfile,內容如下:
# dockerfile hahaFROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"CMD echo "I am cmd"CMD echo $VERSIONENTRYPOINT sleep 1000000先不解釋上面命令的意義,運行該文件構建鏡像。
在構建鏡像前,先在根目錄下創建 test 文件夾,在其下面創建Dockerfile,以及準備構建使用的test文件,使用Xftp將busybox的壓縮包上傳到test目錄下。
具體操作見下面操作截圖:
說明:busybox文件的壓縮包自行在github上下載。
構建鏡像,命令為:
docker build -t centos-with-busybox .從上面 Step 信息可以看出,構建步驟是按照我們在Dockerfile中的命令先后順序執行的,最后生成的鏡像 SIZE 比基礎鏡像要多 9M。
運行容器,檢查構建是否成功, 命令為:
docker run -d --name centos-with-busybox1 centos-with-busybox進入容器可以看到當前目錄為 mydir,而且里面包含 創建的文件以及拷貝進去的文件,busybox壓縮包已經被解壓。
使用docker history 指令查看剛才構建的鏡像:
從紅框中可以看到 dockerfile 文件中執行的操作步驟。
下面詳細解釋下 dockerfile 文件用到的命令:
FROM:表示基于什么基礎鏡像進行構建
MAINTAINER:構建者信息,說明是誰構建的
WORKDIR:指定后續執行步驟的工作目錄,比如拷貝文件,創建文件操作在哪個目錄下執行
RUN:在容器運行命令,比如創建文件 touch xxx.txt
COPY:拷貝數據,即將主機上的文件拷貝到容器中去
ADD:也是拷貝數據,不同的是,如果被拷貝文件是壓縮文件,那么拷貝到容器后會自動解壓縮
ENV:指定環境變量,該環境變量可以在Dockerfile文件中使用,同時在容器中也生效
CMD:容器啟動時運行的命令
ENTRYPOINT:同CMD相似,但也有區別
RUN/CMD/ENTRYPOINT 區別
從上面可以看出 RUN/CMD/ENTRYPOINT 都可以運行命令,那它們的區別是什么呢?
RUN 和 CMD/ENTRYPOINT的區別比較清楚:RUN主要用于在容器安裝軟件,操作文件和文件夾等,CMD/ENTRYPOINT主要用于啟動容器,但是有很大的差別。
下面通過實驗逐步分析二者之不同:
修改 Dockerfile 文件,內容如下:
# dockerfile hahaFROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"CMD echo "I am cmd"CMD echo $VERSION按照上面步驟重新構建鏡像并運行,命令為:
docker run -it --name centos-with-busybox centos-with-busybox鏡像構建就不展示截圖,鏡像名為:centos-with-busybox,創建的容器也使用這個名字。
可以看到容器運行結果為環境變量VERSION的版本信息,但是倒數第二行的CMD命令沒有輸出,說明只有最后一個CMD命令生效。
下面換個方式運行容器,在 docker run 后面指定運行參數:
命令為:
docker run -it --name centos-with-busybox centos-with-busybox /bin/bash指定 /bin/bash 作為啟動參數,發現沒有輸出環境變量VERSION的版本信息,說明CMD命令被 /bin/bash 取代了。
那么ENTRYPOINT會如何表現呢?
修改Dockerfile,內容如下:
# dockerfile hahaFROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"CMD echo "I am cmd"CMD echo $VERSIONENTRYPOINT echo "I am entrypoint"先不加參數運行容器,命令為:
docker run -it --name centos-with-busybox centos-with-busybox可見打印信息和Dockerfile中規定的字符串一致。
帶上參數運行:
docker run -it --name centos-with-busybox centos-with-busybox /bin/bash和上面一致,仍舊打印出一樣的字符串。
對于ENTRYPOINT而言,無論 docker run 是否帶有執行命令,都會執行,而CMD則相反。
問題:如果先后出現兩個ENTRYPOINT命令,那么先出現的會執行嗎?
修改Dockerfile,內容如下:
# dockerfile hahaFROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"CMD echo "I am cmd"CMD echo $VERSIONENTRYPOINT echo "I am entrypoint 1"ENTRYPOINT echo "I am entrypoint 2"構建鏡像,并啟動容器,命令為:
docker run -it --name centos-with-busybox centos-with-busybox只運行了第二個ENTRYPOINT指令,第一個被忽略。
在這點上,ENTRYPOINT和CMD一樣,即如果有多條該命令,只會執行最后一條。
CMD和ENTRYPOINT的區別決定了二者使用上不同:
1、由于CMD命令可以被docker run的命令替換,因此它可以用來設置默認啟動命令,如果用戶不想使用默認命令,就可以在docker run指令中指定自己的容器啟動命令;
2、ENTRYPOINT 是必須執行的命令,所以往往用來啟動應用程序或者服務,設置容器啟動命令最好使用ENTRYPOINT,不要使用CMD。
3、ENTRYPOINT可以和CMD結合起來使用,充分結合二者的優點,可以使容器啟動更加方便。
下面顯示下如何結合使用ENTRYPOINT和CMD兩個命令:
修改Dockerfile,內容如下:
FROM centosMAINTAINER docker-test@example.comWORKDIR /mydirRUN touch mytextCOPY test .ADD busybox-1_29_0.tar.gz .ENV VERSION "1.0.2"ENTRYPOINT ["echo總結
以上是生活随笔為你收集整理的cmd该清华镜像_Docker动手教程3.3:容器镜像构建2的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 快速向服务器传文件格式,客户端如何向服务
- 下一篇: 支付宝沙箱支付步骤
