Dockerfile中的RUN、CMD 和 ENTRYPOINT指令的兩種格式(shell與exec)


shell格式與exec格式

RUN:設置構件容器時就運行的命令以及提交運行結果,RUN經常用於安裝軟件包。dockerfile中可以寫多條RUN指令
CMD:設置容器啟動時執行的命令,在構件時並不運行,CMD能夠被docker run后面跟的命令行參數替換。dockerfile中只能寫一條CMD指令,如果寫了多條,那么只有最后一條生效。
ENTRYPOINT:設置容器啟動時執行的命令,ENTRYPOINT不能被docker run后面跟的命令行參數替換。dockerfile中只能寫一條ENTRYPOINT指令,如果寫了多條,那么只有最后一條生效。

我們可用兩種方式指定 RUN、CMD 和 ENTRYPOINT 要運行的命令

shell格式: <instruction> <command>

exec格式 : <instruction> ["executable", "param1", "param2", ...]

1.下載並導入鏡像

鏡像:

busybox.tar

#1.busybox.tar:是一個自定義的鏡像
[root@foundation66 Desktop]# ls
busybox.tar
#2.導入鏡像
[root@foundation66 Desktop]# docker load -i busybox.tar
8a788232037e: Loading layer 1.37MB/1.37MB
Loaded image: busybox:latest
#3.查看鏡像
[root@foundation66 Desktop]# docker images

在這里插入圖片描述

2.編寫Dockerfile

[root@foundation66 ~]# cd /opt/docker/
[root@foundation66 docker]# ls
Dockerfile dvd.repo webdata
#1.創建目錄
[root@foundation66 docker]# mkdir test
[root@foundation66 docker]# cd test/
#2.編寫文件
[root@foundation66 test]# vim Dockerfile
#########################
FROM busybox        #指定基礎鏡像
ENV name world        #設置環境變量
CMD echo "hello,$name"     #輸出hello world;CMD表示容器啟動時執行的命令;當指令執行時,shell格式底層會調用/bin/sh -c <command> 。

注:如果以上CMD和ENTPYPOINT輸出的話,會優先輸出ENTPYPOINT中的數據.因為ENTPYPOINT會比CMD提前一些執行。

在這里插入圖片描述

3.構建鏡像

[root@foundation66 test]# docker build -t busybox:v1 .

在這里插入圖片描述

4.創建並運行容器

#--rm表示退出后自動刪除
[root@foundation66 test]# docker run --rm busybox:v1
hello,world

5.改進

#1.標准寫法為 CMD [ ]
[root@foundation66 test]# vim Dockerfile
#########################
FROM busybox
ENV name world
CMD ["/bin/echo","hello,$name"]    #當指令執行時,exec格式會直接調用<command>,不會被 shell解析。會打印出hello $name,shell環境有變量,不是shell環境下沒有變量。

在這里插入圖片描述

#構建鏡像
[root@foundation66 test]# docker build -t busybox:v2 .

在這里插入圖片描述

#創建並運行容器;發現無法識別變量
[root@foundation66 test]# docker run --rm busybox:v2
hello,$name    

#2.-c表示自動解析變量
[root@foundation66 test]# vim Dockerfile
#########################
FROM busybox
ENV name world
CMD ["/bin/sh","-c","echo hello,$name"]    #-c表示自動解析變量,輸出結果:hello world,所以一般推薦使用這類形式

在這里插入圖片描述

#構建鏡像
[root@foundation66 test]# docker build -t busybox:v3 .

在這里插入圖片描述

#創建並運行容器
[root@foundation66 test]# docker run --rm busybox:v3
hello,world

ENTRYPOINT與CMD指令:

#1.編寫Dockerfile
[root@foundation66 test]# vim Dockerfile
########################
FROM busybox
ENTRYPOINT ["/bin/echo","hello"]   #ENTRYPOINT表示設置容器啟動時執行的命令,可以自動解析變量,如果ENTPYPOINT在前,CMD在后,就會按照先輸出ENTPROPINT,然后再輸出CMD。

CMD ["world"]             #CMD表示設置容器啟動時執行的命令,它能夠被docker run后面跟的命令行參數替換

在這里插入圖片描述

#2.構建鏡像
[root@foundation66 test]# docker build -t busybox:v4 .

在這里插入圖片描述

#3.創建並運行容器;CMD可被覆蓋(可傳值)
[root@foundation66 test]# docker run --rm busybox:v4
hello world
[root@foundation66 test]# docker run --rm busybox:v4 westos
hello westos

注意:如果鏡像創建錯誤,執行以下命令即可刪除鏡像

[root@foundation66 test]# docker rmi busybox:v4
Untagged: busybox:v4
Deleted: sha256:47bb4f0aee1cc1c78e7f21fe3e3105e1e4dd8d01e2f8005c135999ee136b6576
Deleted: sha256:ecea84c1280d6278e431138f865fe53ad78aefd50b94797c7b732d725622156f


免責聲明!

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



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