一,dockerfile格式
- 注釋#
- 指令 引數
- 指令不區分大小寫,但是推薦全部大寫指令,
- 指令從上到下順序被執行
- 第一個指令必須是【FROM】,指示出要使用的基礎鏡像,
- 執行docker file時,如果使用到了別的組態檔,這些組態檔不能放到【執行docker file目錄】的父目錄,但可以放到子目錄,
- 在執行docker file目錄下,可以放一個隱藏檔案(.dockerignore),里面存放的是build時不需要的檔案,可以使用通配符去指定,比如,某個子目錄里10個檔案,build時有3個檔案不需要,你在docker file里參考的是目錄名,所以這10個檔案都被引入進來了,但如果把不需要的3個檔案,加入到.dockerignore檔案里,build時就它們3個排除了,
- 檔案名必須是:【Dockerfile】或者【dockerfile】
二,dockerfile 命令
目錄:
| 命令 | 簡要說明 |
|---|---|
| FROM | 指定基礎鏡像(base image) |
| MAINTAINER | 不推薦使用,被LABLE替代了 , 用于讓dockerfile制作者提供本人的詳細資訊 |
| LABEL | 用于指定元資料,比如作者,檔案大小 等 |
| COPY | 復制宿主機里的檔案或目錄到:要build出的image的檔案系統的某個目錄里 |
| ADD | 類似COPY,比COPY多了支持壓縮類檔案的自動解壓和從URL下載 |
| WORKDIR | 用于dockerfile中所有RUN,CMD,ENTRYPOINT,COPY和ADD指定設定的作業目錄, |
| VOLUME | 和run -v類似,但只能指定image里的某個目錄,而不能指定宿主機的目錄, |
| EXPOSE | 和-p選項型別,指定容器要暴漏給外部的埠,但不能指定宿主機的埠 |
| ENV | 在容器的系統了定義環境變數,ENV,ADD,COPY等指令可以使用, |
| RUN | 在build執行程序中,執行基礎鏡像里可以執行的任何shell命令 |
| CMD | 在docker build時不被運行,而是在docker run時運行, |
| ENTRYPOINT | 類似CMD指令,用于為容器指定默認運行程式, |
| USER | docker run,CMD,ENTRYPOINT執行的時候,所使用的用戶名或者UID |
| HEALTHCHECK | 定期查看容器里運行的行程是否還在作業狀態 |
| SHELL | 指定用哪個shell去運行RUN |
| STOPSIGNAL | 【docker stop 容器名】默認是個PID為1的行程發送15號信號 |
| ARG | 在build時,通過【--build-arg】傳入到dockerfile里面的變數 |
| ONBUILD | 當別人拿你做成的image作為base image,執行build時,ONBUILD命令才會執行, |
-
FROM命令:repository為基礎鏡像(base image)的名稱,tag為base image的標簽,不指定就是latest,如果不指定registry,就從docker hub上拉取,
-
FROM <registry><repository>[:<tag>]
-
FROM <registry><repository>@<digest>
當從外部registry拉image時,image有可能被別人替換了,但是repository名字相同,所以不安全,digest是image的hash值,所以指定了digest就不會被別人替換掉了,
-
-
MAINTAINER(不推薦使用,被LABLE替代了)命令:用于讓dockerfile制作者提供本人的詳細資訊,
MAINTAINER可以出現在任何位置,但推薦放到FROM后面,
- MAINTANIER "magedu <[email protected]>"
-
LABEL命令:用于指定元資料,比如作者,檔案大小等,
- 用法:LABEL <key>=<value> <key>=<value> ...
-
COPY命令:復制宿主機里的檔案或目錄到:要build出的image的檔案系統的某個目錄里,
-
語法:
- COPY <src> ... <dest>
- COPY ["<src>", ... "<dest>"]
- src:源檔案或目錄,可以使用相對路徑(相對dockerfile所在的路徑),支持使用通配符
- dest:目標路徑,建議絕對路徑,否則,COPY指定則以WORKDIR為起始路徑,
- 注意:在路徑中有空白字符時,使用第二種格式,理由是空白字符是第一種格式的目錄分隔符,
-
檔案復制準則:
-
src必須是dockerfile里面的檔案或目錄,不能是其父目錄中的檔案或路徑,
-
如果src是目錄,則其內部檔案或子目錄都會被遞回復制,但src目錄自身不會被復制,
相當于:cp src/* /dest,
-
如果指定了多個src,或在src中使用了通配符,則dest必須是目錄,且必須以/結尾,
-
如果dest事先不存在,它將會被自動創建,其父目錄也會被一并創建,
-
-
三,build特點:每執一行命令,都會新建一個層,層越多,性能越不好,所以能把命令放在一行,就盡量放在一行,
比如COPY命令,如果目標目錄相同,則最好只使用一次COPY,雖然使用多次COPY也不出錯誤,但是會多出層,性能不好,
docker build命令
獲取幫助資訊:
- PATH:【Dockerfile】或者【dockerfile】檔案所在的目錄,
- -c:制作程序使用多少CPU
- -m:制作程序使用多少記憶體,
- -t:指定image的repository和tag,
# docker build --help
Usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--force-rm Always remove intermediate containers
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable
unlimited swap
--network string Set the networking mode for the RUN instructions
during build (default "default")
--no-cache Do not use cache when building the image
--pull Always attempt to pull a newer version of the image
-q, --quiet Suppress the build output and print image ID on success
--rm Remove intermediate containers after a successful
build (default true)
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
-t, --tag list Name and optionally a tag in the 'name:tag' format
--target string Set the target build stage to build.
--ulimit ulimit Ulimit options (default [])
dockerfile 例子1:拷貝一個檔案,
FROM busybox:latest
MAINTAINER "magedu <[email protected]>"
LABEL maintainer="magedu <[email protected]>"
COPY index.html /data/html/
build一下上面的dockerfile 試試,使用-t,來指定image的名字和tag,發現build成功了,
# docker build -t tinyhttpd:v0.01 ./
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM busybox:latest
---> b534869c81f0
Step 2/4 : MAINTAINER "magedu <[email protected]>"
---> Using cache
---> 5c5a1c47716c
Step 3/4 : LABEL maintainer="magedu <[email protected]>"
---> Using cache
---> 88b87ddfdb22
Step 4/4 : COPY index.html /data/html/
---> Using cache
---> 59b7dd6c3eb8
Successfully built 59b7dd6c3eb8
Successfully tagged tinyhttpd:v0.01
啟動這個image,看看里面有沒有/data/html/index.html
# sudo docker run --name b1 --rm tinyhttpd:v0.01 cat /data/html/index.html
<h1>http server</h1>
dockerfile 例子2:拷貝一個目錄,
FROM busybox:latest
MAINTAINER "magedu <[email protected]>"
LABEL maintainer="magedu <[email protected]>"
COPY index.html /data/html/
COPY yum.repos.d /etc/yum.repos.d/
執行build:
docker build -t tinyhttpd:v0.02 ./
Sending build context to Docker daemon 30.21kB
Step 1/5 : FROM busybox:latest
---> b534869c81f0
Step 2/5 : MAINTAINER "magedu <[email protected]>"
---> Using cache
---> 5c5a1c47716c
Step 3/5 : LABEL maintainer="magedu <[email protected]>"
---> Using cache
---> 88b87ddfdb22
Step 4/5 : COPY index.html /data/html/
---> Using cache
---> 59b7dd6c3eb8
Step 5/5 : COPY yum.repos.d /etc/yum.repos.d/
---> 99d306a25cc7
Successfully built 99d306a25cc7
Successfully tagged tinyhttpd:v0.02
驗證:
docker run --name b1 -it --rm tinyhttpd:v0.02 ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Sources.repo
CentOS-Base.repo_20191129 CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo
CentOS-Debuginfo.repo docker-ce.repo
CentOS-Media.repo
二,dockerfile 命令(續)
-
ADD命令:類似COPY,比COPY多了支持壓縮類檔案的自動解壓和從URL下載
-
語法:
- ADD <src> ... <dest>
- ADD ["<src>", ... "<dest>"]
-
ADD準則:
- 同COPY指令
- 如果src為URL且dest不以/結尾,則src指定的檔案將被下載并直接被創建為dest;如果dest以/結尾,則src指定的檔案將被下載并保存為dest/<filename>
- 如果src是宿主機上的壓縮檔案,它將被自動展開,其行為類似
tar -x;然而通過URL下載的壓縮檔案不會自動展開, - 如果src有多個,或使用了通配符,則dest必須是以/結尾的目錄路徑;如果dest不以/結尾,則其被視作一個普通檔案,src的內容將被直接寫入dest,
-
例子1:使用URL
FROM busybox:latest MAINTAINER "magedu <[email protected]>" LABEL maintainer="magedu <[email protected]>" COPY index.html /data/html/ COPY yum.repos.d /etc/yum.repos.d/ ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src確認結果:
# docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src/ nginx-1.2.9.tar.gz -
例子2:使用本地壓縮檔案
FROM busybox:latest MAINTAINER "magedu <[email protected]>" LABEL maintainer="magedu <[email protected]>" COPY index.html /data/html/ COPY yum.repos.d /etc/yum.repos.d/ #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/ ADD nginx-1.2.9.tar.gz /usr/local/src/確認結果:
# docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src/nginx-1.2.9 CHANGES CHANGES.ru LICENSE README auto conf configure contrib html man src
-
-
WORKDIR命令:用于dockerfile中所有RUN,CMD,ENTRYPOINT,COPY和ADD指定設定的作業目錄,
WORKDIR可以出現多次,這些命名去上面去找離它最近的WORKDIR作為相對路徑的起始,
-
語法:
- WORKDIR <PATH>
- WORKDIR 系統環境變數(比如:$MYENV),
-
例子:
FROM busybox:latest MAINTAINER "magedu <[email protected]>" LABEL maintainer="magedu <[email protected]>" COPY index.html /data/html/ COPY yum.repos.d /etc/yum.repos.d/ #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/ WORKDIR /usr/local/ ADD nginx-1.2.9.tar.gz ./src1/確認結果:
sudo docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src1/nginx-1.2.9 [sudo] password for ys: CHANGES CHANGES.ru LICENSE README auto conf configure contrib html man src
-
-
VOLUME:和run -v類似,但只能指定image里的某個目錄,而不能指定宿主機的目錄,
-
語法:
- VOLUME <mountpoint>
- VOLUME ["mountpoint1", "mountpoint2"]
-
注意:如果image掛載點目錄下有檔案,則啟動容器后,會把掛載點下的檔案拷貝到宿主機,
-
例子:
FROM busybox:latest MAINTAINER "magedu <[email protected]>" LABEL maintainer="magedu <[email protected]>" COPY index.html /data/html/ COPY yum.repos.d /etc/yum.repos.d/ #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/ WORKDIR /usr/local/ ADD nginx-1.2.9.tar.gz ./src/ VOLUME /usr/local/src確認結果:由于image的/usr/local/src目錄下有nginx-1.2.9,所以nginx-1.2.9會被拷貝到宿主機,
# docker run --name b1 -it --rm tinyhttpd:v0.03 # ls /var/lib/docker/volumes/1240925e87efaa5d9ed375b268a6d804c29013c04792f9a0dde9e135aa7e9f9e/_data/ nginx-1.2.9
-
-
EXPOSE:和-p選項型別,指定容器要暴漏給外部的埠,但不能指定宿主機的埠,因為在作dockerfile的時候,無法確定此image運行在什么宿主機上,也就無法知道宿主機上哪些埠可以使用,所以是隨機去找宿主機里可以使用的埠,
注意:即使使用了EXPOSE命令,但如果RUN時不加
-P選項的話,埠也不會被暴露出去的,-
語法:EXPOSE <port>[/protocol] <port>[/protocol]
- protocol是傳輸層協議,tcp或者udp,不知道就是tcp
- 可以一次指定多個埠,比如:EXPOSE 5255 5254/udp
-
例子:
FROM busybox:latest MAINTAINER "magedu <[email protected]>" LABEL maintainer="magedu <[email protected]>" COPY index.html /data/html/ COPY yum.repos.d /etc/yum.repos.d/ #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/ WORKDIR /usr/local/ ADD nginx-1.2.9.tar.gz ./src/ VOLUME /usr/local/src EXPOSE 80確認結果:
啟動時先不指定
-P,用docker port查看,發現沒有埠,# docker run --name b1 --rm tinyhttpd:v0.03 /bin/httpd -f -h /data/html/ # docker port b1啟動時先指定
-P,用docker port查看,發現有埠,# docker run --name b1 --rm -P tinyhttpd:v0.03 /bin/httpd -f -h /data/html/ # docker port b1 80/tcp -> 0.0.0.0:32768 -
EXPOSE的作用是:默認想暴露的埠,在啟動的時候,可以使用
-p去覆寫EXPOSE指定的埠,
-
-
ENV:在容器的系統了定義環境變數,ENV,ADD,COPY等指令可以使用,
-
語法:
- ENV <key> <value>
- ENV <key>=<value> ...
- 第一種格式,<key>之后所以內容都被視作為value,只能定義一個變數,
- 第二種格式,定義多個變數,如果value中包含空格,使用\進行轉義,也可以通過對value加引號進行標識;另外,\也用做換行,
- 定義多個變數時,要使用第二種格式,以便不會增加額外的層,導致image過大,
-
例子:${DOC_ROOT:-/data/html/}的用法是,if(DOC_ROOT 沒有值) {DOC_ROOT=/data/html/}
FROM busybox:latest MAINTAINER "magedu <[email protected]>" LABEL maintainer="magedu <[email protected]>" ENV DOC_ROOT=/data/html/ \ WEB_SERVER_PACKAGE="/nginx-1.2.9" COPY index.html ${DOC_ROOT:-/data/html/} COPY yum.repos.d /etc/yum.repos.d/ #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/ WORKDIR /usr/local/ ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/ VOLUME /usr/local/src EXPOSE 80 -
延申,在docker run的時候也可以使用
-e選項設定環境變數,在run的時候,通過-e,可以改變dockerfile里指定環境變數的值,
dockerfile里定義的是nginx-1.2.9,但是-e指定的nginx-1.2.3,所以WEB_SERVER_PACKAGE=/nginx-1.2.3,
# docker run --name b1 --rm -e WEB_SERVER_PACKAGE=/nginx-1.2.3 tinyhttpd:v0.03 printenv PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=7a242517b02e WEB_SERVER_PACKAGE=/nginx-1.2.3但是,/usr/local/src里的目錄還是nginx-1.2.9,因為在build的時點,image里放的就已經是nginx-1.2.9了,所以你在-e里,改變的只是環境變數的值而已,
# docker run --name b1 --rm -e WEB_SERVER_PACKAGE=/nginx-1.2.3 tinyhttpd:v0.03 ls /usr/local/src nginx-1.2.9
-
-
RUN:在build執行程序中,執行基礎鏡像里可以執行的任何shell命令,如果是多個命令是有關聯的話,最好寫到一起,
-
語法:
- RUN <command>
- RUN ["executable1","arg1","executable2","arg1"]
- 例如:RUN ["/bin/bash","-c","ls","-ltr"]
-
例子:我們指定ADD里的src如果是壓縮檔案的話,不會自動解壓縮,所以我們RUN一個tar命令去解壓縮它,
FROM busybox:latest MAINTAINER "magedu <[email protected]>" LABEL maintainer="magedu <[email protected]>" ENV DOC_ROOT=/data/html/ \ WEB_SERVER_PACKAGE="nginx-1.2.9" COPY index.html ${DOC_ROOT:-/data/html/} COPY yum.repos.d /etc/yum.repos.d/ ADD http://nginx.org/download/${WEB_SERVER_PACKAGE}.tar.gz /usr/local/src/ RUN cd /usr/local/src && \ tar xf ${WEB_SERVER_PACKAGE}.tar.gz -
RUN用途舉例:先找個基礎的centos鏡像,然后裝一個nginx,一般都是下載源代碼編譯安裝,不是使用yum install,理由是yum會產生多余的檔案,
FROM centos RUN yum -y install epel-release && \ yum makecache && \ yum install nginx
-
-
CMD:在docker build時不被運行,而是在docker run時運行,比如nginx鏡像啟動的時候,那么CMD肯定是啟動nginx的命令,所以CMD即使給了多個,只有最后一個生效,
-
語法:
-
CMD <command>
command通常是shell命令,而且是以/bin/sh -c來運行此命令,因此,是通過shell啟動的,所以可以使用shell的特性,而且啟動結束后,shell行程會自動推出,讓此行程代替shell行程,所以它pid是1,
-
CMD ["executable1","arg1","executable2","arg1"]
executable是目錄名加上可執行程式名,比如/bin/ls,它不是通過/bin/sh -c來運行,是由內核直接啟動,由于不是由shell啟動,所以shell里的通配符,管道,重定向等特性,全部不能用,如果想用shell特性,可以這么使用:CMD ["/bin/bash","-c","executable","arg"].
-
RUN的第一種和第二種用法和CMD的第一種和第二種用法一樣,
-
CMD ["arg1","arg2"]
配合ENTRYPOINT命令使用,
-
-
例子:
FROM busybox LABEL maintainer="mageedu <[email protected]>" app="httpd" ENV WEB_ROOT="/data/web/html/" RUN mkdir -p ${WEB_ROOT} && \ echo '<h1>Busybox httpd.</h1>' > ${WEB_ROOT}/index.html CMD /bin/httpd -f -h ${WEB_ROOT}確認結果:用inspect確認,確實是用/bin/sh -c來啟動的,
"Cmd": [ "/bin/sh", "-c", "/bin/httpd -f -h ${WEB_ROOT}" ],pid也是1
docker exec -it b1 /bin/sh / # ps PID USER TIME COMMAND 1 root 0:00 /bin/httpd -f -h /data/web/html/ 6 root 0:00 /bin/sh 11 root 0:00 ps # printenv HOSTNAME=e877c51f7dab WEB_ROOT=/data/web/html/
-
-
ENTRYPOINT:
-
類似CMD指令,用于為容器指定默認運行程式,
-
與CMD不同的是,不會被docker run指定的引數覆寫(也有覆寫的辦法),而且docker run指定的引數,會自動加到ENTRYPOINT命令的后面,相當于ENTRYPOINT命令的引數了,
-
run時使用--entrypoint string選項,可以強制替換ENTRYPOINT命令,
-
如果docker run時沒有指定引數,則使用上面CMD的第三種格式定義的引數,作為ENTRYPOINT的引數,
-
如果docker run時指定了引數,CMD的第三種格式也指定了引數,ENTRYPOINT使用的是docker run時指定的引數,忽略CMD的第三種格式指定的引數,
-
dockerfile檔案種也可以出現多個ENTRYPOINT,但只有最后一個生效,
-
語法:
- ENTRYPOINT <command>
- ENTRYPOINT ["executable", "param1", "param2"]
-
例子:在build時創建nginx的組態檔,而且在run的時候,還可以通過-e引數傳遞環境變數,修改監聽的埠號等資訊,
FROM nginx:alpine LABEL maintainer="MageEdu <[email protected]>" ENV NGX_DOC_ROOT="/data/web/html/" ADD entrypoint.sh /bin/ ADD index.html ${NGX_DOC_ROOT} CMD ["/usr/sbin/nginx", "-g", "daemon off;"] ENTRYPOINT ["/bin/entrypoint.sh"]ENTRYPOINT命令執行的是一個自己定義的shell命令檔案,內容如下,
-
首先用cat命令創建了一個nginx的組態檔,還使用了環境變數,
-
然后,呼叫exec系統函式,引數是CMD定義的命令:["/usr/sbin/nginx", "-g", "daemon off;"],exec函式的作用是:啟動ngxin行程,并終止當前行程(/bin/sh行程),讓nginx行程取代當前的shell行程,所以nginx行程的pid是1,
"$@":shell的全部引數,也就是/usr/sbin/nginx", "-g", "daemon off;
entrypoint.sh:
#!/bin/sh cat > /etc/nginx/conf.d/www.conf << EOF server { server_name $HOSTNAME; listen ${IP:-0.0.0.0}:${PORT:-80}; root ${NGX_DOC_ROOT:-/usr/share/nginx/html}; } EOF exec "$@"當run的時候,執行ENTRYPOINT命令,引數是CMD里定義的,
確認結果:通過-e把監聽埠設定成了8080;nginx的pid是1;www.conf也被創建了,在宿主機器上執行【curl -H "Host: a6b94dae9be4" 192.0.0.2:8080】,也輸出了index.html的結果,
# docker run --name b1 --rm -d -e "PORT=8080" mynignx:002 # docker exec -it b1 /bin/sh / # netstat -tnl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN # cat /etc/nginx/conf.d/www.conf server { server_name a6b94dae9be4; listen 0.0.0.0:8080; root /data/web/html/; } / # ps PID USER TIME COMMAND 1 root 0:00 nginx: master process /usr/sbin/nginx -g daemon off; 8 nginx 0:00 nginx: worker process # cat /data/web/html/index.html <h1>nginx hello</h1> $ curl -H "Host: a6b94dae9be4" 192.0.0.2:8080 <h1>nginx hello</h1>試驗一下,在run時,指定引數:/usr/sbin/nginx daemon off(故意不加-g),去覆寫CMD,因為缺少了-g,所以容器啟動失敗,說明了,確實覆寫CMD里定義的命令,
# docker run --name b1 --rm -d -e "PORT=8080" mynignx:002 /usr/sbin/nginx daemon off 4c88e021408c143ec45e70611c42bd715831cb9c75d6f4a00d307a7a6b53af5c [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES試驗一下,使用--entrypoint "/bin/sh",覆寫ENTRYPOINT,
覆寫成功了,1號行程是/bin/sh行程;www.conf檔案沒有被創建;nginx行程沒有被啟動,
# docker run --name b1 --rm -it -e "PORT=8080" --entrypoint "/bin/sh" mynignx:002 / # ls bin dev home media opt root sbin sys usr data etc lib mnt proc run srv tmp var / # ps PID USER TIME COMMAND 1 root 0:00 /bin/sh 7 root 0:00 ps / # ls /etc/nginx/conf.d/ default.conf -
-
ENTRYPOINT用法的最佳實踐:build之前事先創建好組態檔,build時,注入到image了,就能達到動態創建各種服務的組態檔,從而解決了只是因為組態檔的不同,而不得不創建多個image的問題,
-
-
USER
-
使用USER的背景,不指定USER的時候,行程的所有者都是root,比如下面的nginx,當不希望是root的時候,使用此命令,
/ # ps PID USER TIME COMMAND 1 root 0:00 nginx: master process nginx -g daemon off; -
docker run,CMD,ENTRYPOINT執行的時候,所使用的用戶名或者UID
-
默認情況下是root
-
語法:USER <UID> | <UserName>
UID或者UserName必須是在image里存在的,必須存在于/etc/passwd中,
-
-
HEALTHCHECK:
-
定期查看容器里運行的行程是否還在作業狀態,docker自己會自動檢查容器里的行程是否還活著,如果死了或者不在前臺運行的時候,docker會自動殺死這個容器,但這是不夠的,有的容器即使活著,但不能提供服務了,那也相當于死了,所以要自己定義一個命令去檢查容器里運行的行程,是否還在作業,
-
語法:
- HEALTHCHECK [OPTION] CMD command
- OPTION:
- --interval=:檢查的間隔(默認:30秒)
- --timeout=:定義超時時長(默認:30秒)
- --start-period=:等多久開始第一次健康檢查(默認:0秒)
- --retries=:發現不健康了,不是立即殺死容器,而要再試驗幾次,再試驗的次數(默認:3次),
- 健康檢查結果:
- 0:success
- 1:unhealthy
- 2:reserved(保留,為使用)
- OPTION:
- HEALTHCHECK NONE
- HEALTHCHECK [OPTION] CMD command
-
例子:健康檢查結果是正常的,
FROM nginx:alpine LABEL maintainer="MageEdu <[email protected]>" ENV NGX_DOC_ROOT="/data/web/html/" ADD entrypoint.sh /bin/ ADD index.html ${NGX_DOC_ROOT} HEALTHCHECK --interval=3s --timeout=3s \ CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/ CMD ["/usr/sbin/nginx", "-g", "daemon off;"] ENTRYPOINT ["/bin/entrypoint.sh"]結果確認:
# docker run --name b1 --rm mynginx:v001 127.0.0.1 - - [08/Dec/2019:13:54:18 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-" 127.0.0.1 - - [08/Dec/2019:13:54:21 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-" 127.0.0.1 - - [08/Dec/2019:13:54:25 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-" -
例子:健康檢查結果是不正常的,發現不正常后,直接【kill 1】,容器啟動后,馬上就被殺死了,
FROM nginx:alpine LABEL maintainer="MageEdu <[email protected]>" ENV NGX_DOC_ROOT="/data/web/html/" ADD entrypoint.sh /bin/ ADD index.html ${NGX_DOC_ROOT} HEALTHCHECK --interval=1s --timeout=1s --retries=1 \ CMD wget -O - -q http://${IP:-0.0.0.0}:10080/ || kill 1 CMD ["/usr/sbin/nginx", "-g", "daemon off;"] ENTRYPOINT ["/bin/entrypoint.sh"]
-
-
SHELL:指定用哪個shell去運行RUN,CMD,ENTRYPOINT的命令,默認是/bin/sh -c,
- 語法:SHELL ["executable", "parameters"]
- 可以出現多次,每次都會覆寫上一次,
-
STOPSIGNAL:【docker stop 容器名】默認是個PID為1的行程發送15號信號,STOPSIGNAL可以指定別的信號,
- 語法:STOPSIGNAL 信號,
-
ARG:
-
在build時,通過【--build-arg】傳入到dockerfile里面的變數
-
dockerfile里可以有多個ARG
-
語法: ARG <name>[=<default value>]
-
可以在dockerfile里定有ARG的默認值
ARG version=1.14
-
例子:
FROM nginx:alpine ARG author="MageEdu <[email protected]>" LABEL maintainer=${author}確認結果:build時,沒有使用--build-arg
# docker build -t mynginx:v002 ./ # docker image inspect mynginx:v002 "Labels": { "maintainer": "MageEdu <[email protected]>" },確認結果:build時,使用--build-arg
# docker build --build-arg author="abc <[email protected]>" -t mynginx:v002 ./ # docker image inspect mynginx:v002 "Labels": { "maintainer": "abc <[email protected]>" },
-
-
ONBUILD
- build時不執行此命令,
- 當別人拿你做成的image作為base image,執行build時,ONBUILD命令才會執行,
- 語法:ONBUILD 任何dockerfile命令(除了FROM和MAINTAINER)
- ONBUILD ADD或者ONBUILD COPY要格外小心,因為你不知道別人在拿你的image做base image時,檔案都放在哪里,ADD如果是遠程要下載的檔案是沒有問題的,
c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/100337.html
標籤:其他
下一篇:清除Windows系統圖示快取
