【Docker實戰之入門】Dockerfile詳細分析(5):ENTRYPOINT和CMD命令的區別

ENTRYPOINT用法
clipboard.pngphp

entrypoint在dockerfile當中只有最後一條生效,其餘entrypoint都不生效
第一種寫法相似數組形式,推薦使用。使用這種方法啓動的進程的pid1
第二章方法執行命令啓動的進程,該進程的pid爲執行完這個shell的pidmysql

CMD用法
clipboard.pngnginx

第一種用法,也是數組格式。
第二種用法,爲entrypoint指定參數。好比,entrypoint執行命令 usrs/bin/Nginx,cmd能夠提供參數如start,結合起來即爲usrs/bin/nginx start.
第三種寫法,pid號也是shell執行的pid號。是Linux下 /bin/sh -c 的用法。git

構建鏡像須要基於一個基礎鏡像。下面基於centos7這個基礎鏡像構建一個鏡像。sql

[root@Optimus /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
wordpress           latest              b027afd30886        33 hours ago        409.2 MB
csphere/wordpress   4.2                 6d90342cc99d        2 days ago          747.3 MB
csphere/mysql       5.5                 e147ac2a588e        6 days ago          752.7 MB
csphere/php-fpm     5.4                 1b08c94ce801        8 days ago          709.7 MB
csphere/centos      7.1                 fd1f7619e63e        9 days ago          613 MB
centos              centos7.1.1503      879c6d07c60e        7 weeks ago         212.1 MB
[root@Optimus /]#

-----
使用cmddocker

建立dockerfileshell

[root@Optimus /]# vim Dockerfile

FROM centos:centos7.1.1503

CMD ["/bin/echo", "This is test cmd"]

build的時候出錯,提示沒有權限vim

[root@Optimus /]# docker build -t csphere/cmd:0.1 .
Error checking context is accessible: 'no permission to read from 'proc/sys/net/ipv4/route/flush''. Please check permissions and try again.

刪除Dockerfilecentos

rm -rf 目錄名字
-r 就是向下遞歸,無論有多少級目錄,一併刪除
-f 就是直接強行刪除,不做任何提示的意思~    

rm -rf Dockerfile

進入docker-training目錄下面,從新建立Dockerfile,構建鏡像數組

[root@Optimus docker-training]# docker build -t csphere/cmd:0.1
docker: "build" requires 1 argument.
See 'docker build --help'.

Usage: docker build [OPTIONS] PATH | URL | -

Build a new image from the source code at PATH
[root@Optimus docker-training]# docker build -t csphere/cmd:0.1 .
Sending build context to Docker daemon 27.55 MB
Sending build context to Docker daemon 
Step 0 : FROM centos:centos7.1.1503
          ---> 879c6d07c60e
Step 1 : CMD /bin/echo This is test cmd
          ---> Running in 3dce9e75bdc8
          ---> f32bb73e8383
Removing intermediate container 3dce9e75bdc8
Successfully built f32bb73e8383
[root@Optimus docker-training]#

接下來能夠經過csphere/cmd:0.1這個鏡像來啓動一個容器

docker run -it --rm 
--rm參數的意識是,只要容器一退出,則刪除容器

[root@Optimus docker-training]# docker run -it csphere/cmd:0.1
This is test cmd

能夠看到,/bin/echo This is test cmd 這條命令成功執行。

直接進入container裏面,而不執行echo指令,能夠在docker run 後面直接加上/bin/bash命令,/bin/bash命令會覆蓋掉cmd後面的命令。

[root@Optimus docker-training]# docker run -it csphere/cmd:0.1 /bin/bash
[root@cd32d71fb9c5 /]# 

/bin/bash 命令覆蓋掉了dockerfile中的cmd命令,直接進入到了container中。

---

使用entrypoint

[root@Optimus docker-training]# vim Dockerfile 

FROM centos:centos7.1.1503

ENTRYPOINT ["/bin/echo", "This is test entrypoint"]
~

構建鏡像

[root@Optimus docker-training]# docker build -t csphere/ent:0.1 .
Sending build context to Docker daemon 27.55 MB
Sending build context to Docker daemon 
Step 0 : FROM centos:centos7.1.1503
          ---> 879c6d07c60e

直接在docker run 後面加參數/bin/bash,entrypoint會把/bin/bash當成一個echo的字符串參數,不會進入到容器中。

[root@Optimus docker-training]# docker run -it csphere/ent:0.1 /bin/bash
This is test entrypoint /bin/bash

若是想覆蓋dockerfile中entrypoint指令,能夠在docker run命令中加--entrypoint參數來指定。

[root@Optimus docker-training]# docker run -it --entrypoint=/bin/bash csphere/ent:0.1
[root@bc7378b9ca83 /]# 

Step 1 : ENTRYPOINT /bin/echo This is test entrypoint
          ---> Running in 40b01fac38af
          ---> 9714a8b5bb85
Removing intermediate container 40b01fac38af
Successfully built 9714a8b5bb85
[root@Optimus docker-training]#

啓動容器

[root@Optimus docker-training]# docker run -it csphere/ent:0.1
This is test entrypoint

----
其餘

刪除鏡像

docker rmi 鏡像
若是有啓動中的容器正在使用該鏡像,不能刪除該鏡像。刪除鏡像前,先中止container。-f 參數強制刪除鏡像。

若是對文件有修改,能夠使用一下命令,更新git 倉庫

git add *
git commit -M ""
git push origin master  提交到本身的倉庫中
相關文章
相關標籤/搜索