您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何正確的使用Dockerfile命令,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1 FROM ---指定基礎鏡像
基礎鏡像不存在會在Docker Hub上拉去
使用格式:
FROM <鏡像>:[tag]
FROM <鏡像>@digest[校驗碼]
當前主機沒有此鏡像時,會自動去官網HUB下載
..............................................
2 MAINTANIER --提供Dockerfile 制作者提供本人信息
[逐漸廢棄]
LABLE --替代MAINTANIER
具體使用:
LABLE maintainer="作者信息"
使用格式:
MAINTANIER "guowei <597599150@qq.com>"
.......................................................
3 COPY --把宿主機中的文件復制到鏡像中去!
文件要在Dockerfile工作目錄
src 原文件
--支持通配符
--通常相對路徑
dest 目標路徑
--通常絕對路徑
有空白字符隔開的字串需要用"",否則會被當做兩個文件!
文件復制準則:
1 src必須是build上下文中的路徑,不能是其父目錄
2 如果src是目錄,則其內部文件或子目錄會被遞歸復制
但src目錄自身不會被復制
3 如果指定了多個src,或在src中使用了通配符,則dest必須是一個
目錄,且必須以/結尾
4 如果dest實現不存在,它將會被自動創建,這包括其父目錄
..............................................................
4 ADD --類似COPY命令
支持URL路徑----如果可以訪問網絡的話,會訪問網絡下載
到本地然后打包進鏡像!
操作準則:
1 如果src為URL且dest不以/結尾,則src指定的文件將被下載并
直接被創建為dest;如果dest以/結尾,則文件名URL指定的文件
將被直接下載并保存為dest/filename
2 如果是壓縮包會被解壓,但通過URL路徑獲取到的tar文件不會被展開
3 如果src有多個,或其間接或直接使用了通配符,則dest必須是一個
以/結尾的目錄路徑,如果dest不以/結尾,則其被視為一個普通文件
src的內容將被直接寫入到dest中!
...............................................................
5 WORKDIR --指定工作目錄
每次只會影響這個指令后續的指令
ADD nginx-1.14.2.tar.gz /usr/local/src/ --不受影響
WORKDIR /usr/local/src/
ADD nginx-1.14.2.tar.gz ./ --受影響
.............................................................
6 VOLUME --卷
只能定義docker管理的卷:
VOLUME /data/mysql
運行的時候會隨機在宿主機的目錄下生成一個卷目錄!
................................................................
7 EXPOSE 為容器打開指定要監聽的端口以實現與外部通信
使用格式:
EXPOSE 80/tcp 23/udp
不加協議默認為tcp
使用-P選項可以暴露這里指定的端口!
但是宿主的關聯至這個端口的端口是隨機的!
..............................................................
8 ENV
用于為鏡像定義所需的環境變量,并可被Dockerfile文件中位于
其后的其它命令所調用
調用格式:
$A 或 ${A}
ENV <key> <value>
ENV <key>=<value>
第一種格式中,key之后的所有內容均會被其視作<value>的組成部分
因此,一次只能設置一個變量!
第二種格式可用一次設置多個變量,每個變量為一個<key>=<value>
的鍵值對,如果<value>中包含空格,可以反斜線(\)進行轉義
也可以通過對<value>加引號進行標識。另外,反斜線也可用于續航
定義多個變量時。建議使用第二種方式,以便在同一層中完成所有功能
具體用法:
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/
ENV A /web/html
COPY index.html ${A:-/web/html}
在docker run 中傳遞變量:
docker run -e [list] 傳變量值
如果在dockerfile中賦值變量后也能在docker run中繼續賦值
docker run --name b1 --rm -e A=xx [鏡像ID]
不會影響docker build 的過程!
printenv --輸出環境變量信息
..............................................................
9 RUN命令:
使用格式:
RUN <command>
RUN ["<executable>","<param1>","<param2>"]
第一種格式中 <command命令通常是一個shell命令 且以"/bin/sh -c">來運行它
這意味此進程在容器中的PID不能為1,不能接收Unix信號,因此,當使用docker stop命令
來停止容器時,此進程接收不到信號
第二種語法格式中的參數是一個JSON格式的數組,其中<executable>為要運行的命令,后面的
<paramN>為傳遞給命令的選項或參數,然而,此種格式指定的命令不會以"/bin/sh -c">來運行它
因此常見的shell操作如變量替換以及通配符替換將不會進行 不過如果要運行的命令依賴于
此shell特性的話,可以將其替換為下面的格式:
RUN ["/bin/bash","-c","<executable>","<param1>"]
........................................................................
10 CMD命令:運行于docker run中
語法有三種寫法
1. CMD ["executable","param1","param2"] --啟動為ID為1的進程
具體實例:
CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html]
2. CMD ["param1","param2"]
3. CMD command param1 param2 --直接運營為shell的子進程
param*=執行參數
例如第二種:
CMD ["nginx"]
docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx
只能是雙引號!
CMD ["param1","param2"]
--此種用法用于為ENTRYPOINT指令提供默認參數
可用于執行腳本:
添加腳本:
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
RUN chmod +x /apps/tomcat/bin/run_tomcat.sh
RUN chown -R tomcat:tomcat /apps /data/tomcat
CMD ["/apps/tomcat/bin/run_tomcat.sh"] -- 引用腳本!
..............................................................
11 ENTRYPOINT
類似CMD指令的功能,用于為容器指定默認運行程序,從而使得容器像是一個單獨
的可執行程序
與CND不同的是,由這個指令啟動的程序不會被docker run 命令行指定的參數所覆蓋
而且,這些命令行參數會被當做參數傳遞給ENTRYPOINT指定的程序
使用格式:
ENTRYPOINT <command>
ENTRYPOINT ["<executable>","<param1>","<param2>"]
docker run 命令傳入的命令參數會覆蓋CMD指定的內容并且附加到ENTRYPOINT
命令最后作為其參數使用
Dockerfile文件中也可以存在多個此指令,但僅有最后一個生效!
在docker run時,使用--entrypoint string選項傳遞的命令 可以覆蓋Dockerfile中
定義的ENTRYPOINT指令
如何讓Nginx配置文件接收參數
創建一個腳本:
#!/bin/bash
#
cat > /etc/nginx/conf.d/www.conf <<EOF
server {
server_name ${HOSTNAME};
listen ${IP:-0.0.0.0}:${PORT:-80};
root ${ROOT:-/web/html};
}
EOF
exec "$@"
chmod +x nginx-conf.sh
Dockerfile文件:
FROM xxx
ENV ROOT='/web/html/'
ADD index.html ${ROOT}
ADD nginx-conf.sh /bin/nginx-conf.sh
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/nginx-conf.sh"]
docker run --name b1 --rm -P -e "PORT=8080" [鏡像ID]
注意:必須使用雙引號!!!
................................................................................
12 USER命令:
用于指定運行image時的或運行Dockerfile中的任何RUN,CMD或ENTRYPOINT
指令指定的程序時的用戶名或UID
默認情況下,container的運行身份為root
格式:
USER <UID>|<UserName>
需要注意的是<UID>可以為任意數字,但實踐中其必須為/etc/passwd中某用戶的有效
UID否則docker run命令將運行失敗!
必須要在容器中的/etc/passwd文件中個存在
....................................................................
13 HEALTHCHECK
健康狀態監測
HEALTHCHECK NONE --不要做監測
常用選項:
--interval=DURATION 默認30秒 --多長時間監測一次
--timeout=DURATION 默認30秒 --監測超時時間
--start-period=DURATION --當docker容器啟動后,延遲多長時間才健康檢查
默認0秒
--retries=N 默認3次
默認檢查多少次在認為失敗
響應值:
0--成功
1--失敗
2--自定義
應用示例:
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit1
Dockerfile中應用:
HEALTHCHECK --start-period=3s CMD wget -O - -q http://{IP:-0.0.0.0}:${PORT:-80}/
也可以在docker run中定義:
--health-cmd string
--health-interval duration
--health-retries int
--health-start-period duration
--health-timeout duration
.................................................................
14 SHELL指令:
["cmd","/S","/C"] --windons
...........................................................
15 STOPSIGNAL命令:
STOPSIGNAL 信號名稱
定義停止命令的信號!
SIGKILL --9信號
.............................................................
16 ARG參數:
用于docker build 的過程中使用
可以被--buil-arg當做參數傳遞過來!
具體應用:
ARG auther=tim
LABLE maintainer=${auther}
docker build --build-arg auther=tom -t xxx ./
在dockerfile中存在的arg變量,如果在docker build 時也
設置了--build-arg變量,這樣最終以命令行界面的變量值為
最終值!
.................................................................
17 ONBUILD
用于在dockerfile中定義一個觸發器
dockerfile用于build映像文件,此映像文件亦可作為base image被另一個
dockerfile用作from指定的參數,并以之構建新的影響文件
在后面的這個dockerfile中的from指定在build過程中被執行時,將會觸發
創建其base image的dockerfile文件的ONBUILD指定定義的觸發器
格式:
ONBUILD 要執行的Dockerfile指令
盡管任何指令都可注冊成為觸發器指令,但ONBUILD不能自我嵌套
且不會觸發from和maintainer指令
使用包含onbuild指定的dockerfile構建的鏡像應該使用特殊的標簽
例如ruby:2.0-onbuild
在onbuild指令中使用add或copy指令硬格外小心,因為構建過程的上下文
在缺少指定的源文件時會失敗!
關于如何正確的使用Dockerfile命令就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。