溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何正確的使用Dockerfile命令

發(fā)布時(shí)間:2021-04-02 14:54:01 來(lái)源:億速云 閱讀:224 作者:Leah 欄目:服務(wù)器

這篇文章給大家介紹如何正確的使用Dockerfile命令,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

1 FROM ---指定基礎(chǔ)鏡像

    基礎(chǔ)鏡像不存在會(huì)在Docker Hub上拉去
使用格式:  
FROM <鏡像>:[tag]    
FROM <鏡像>@digest[校驗(yàn)碼]
當(dāng)前主機(jī)沒(méi)有此鏡像時(shí),會(huì)自動(dòng)去官網(wǎng)HUB下載
..............................................

2 MAINTANIER --提供Dockerfile 制作者提供本人信息

    [逐漸廢棄]
LABLE --替代MAINTANIER
具體使用:
LABLE maintainer="作者信息"

使用格式:

MAINTANIER "guowei <597599150@qq.com>"

.......................................................

3 COPY --把宿主機(jī)中的文件復(fù)制到鏡像中去!

    文件要在Dockerfile工作目錄
src 原文件
    --支持通配符
    --通常相對(duì)路徑
dest 目標(biāo)路徑  
    --通常絕對(duì)路徑

有空白字符隔開(kāi)的字串需要用"",否則會(huì)被當(dāng)做兩個(gè)文件!

文件復(fù)制準(zhǔn)則:
1 src必須是build上下文中的路徑,不能是其父目錄
2 如果src是目錄,則其內(nèi)部文件或子目錄會(huì)被遞歸復(fù)制
   但src目錄自身不會(huì)被復(fù)制
3 如果指定了多個(gè)src,或在src中使用了通配符,則dest必須是一個(gè)
  目錄,且必須以/結(jié)尾
4 如果dest實(shí)現(xiàn)不存在,它將會(huì)被自動(dòng)創(chuàng)建,這包括其父目錄
..............................................................

4 ADD --類似COPY命令

支持URL路徑----如果可以訪問(wèn)網(wǎng)絡(luò)的話,會(huì)訪問(wèn)網(wǎng)絡(luò)下載
到本地然后打包進(jìn)鏡像!

操作準(zhǔn)則:
1 如果src為URL且dest不以/結(jié)尾,則src指定的文件將被下載并
直接被創(chuàng)建為dest;如果dest以/結(jié)尾,則文件名URL指定的文件
將被直接下載并保存為dest/filename

2 如果是壓縮包會(huì)被解壓,但通過(guò)URL路徑獲取到的tar文件不會(huì)被展開(kāi)

3 如果src有多個(gè),或其間接或直接使用了通配符,則dest必須是一個(gè)
以/結(jié)尾的目錄路徑,如果dest不以/結(jié)尾,則其被視為一個(gè)普通文件
src的內(nèi)容將被直接寫(xiě)入到dest中!

...............................................................

5 WORKDIR --指定工作目錄

每次只會(huì)影響這個(gè)指令后續(xù)的指令

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

運(yùn)行的時(shí)候會(huì)隨機(jī)在宿主機(jī)的目錄下生成一個(gè)卷目錄!
................................................................

7 EXPOSE 為容器打開(kāi)指定要監(jiān)聽(tīng)的端口以實(shí)現(xiàn)與外部通信

使用格式:
EXPOSE 80/tcp 23/udp

不加協(xié)議默認(rèn)為tcp

使用-P選項(xiàng)可以暴露這里指定的端口!
但是宿主的關(guān)聯(lián)至這個(gè)端口的端口是隨機(jī)的!
..............................................................

8 ENV

用于為鏡像定義所需的環(huán)境變量,并可被Dockerfile文件中位于
其后的其它命令所調(diào)用

調(diào)用格式:
$A 或 ${A}

ENV <key> <value>
ENV <key>=<value>

第一種格式中,key之后的所有內(nèi)容均會(huì)被其視作<value>的組成部分
因此,一次只能設(shè)置一個(gè)變量!

第二種格式可用一次設(shè)置多個(gè)變量,每個(gè)變量為一個(gè)<key>=<value>
的鍵值對(duì),如果<value>中包含空格,可以反斜線(\)進(jìn)行轉(zhuǎn)義
也可以通過(guò)對(duì)<value>加引號(hào)進(jìn)行標(biāo)識(shí)。另外,反斜線也可用于續(xù)航

定義多個(gè)變量時(shí)。建議使用第二種方式,以便在同一層中完成所有功能
具體用法:
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中繼續(xù)賦值
docker run --name b1 --rm -e A=xx [鏡像ID]
不會(huì)影響docker build 的過(guò)程!

printenv --輸出環(huán)境變量信息

..............................................................

9 RUN命令:

使用格式:
RUN <command>
RUN ["<executable>","<param1>","<param2>"]

第一種格式中 <command命令通常是一個(gè)shell命令 且以"/bin/sh -c">來(lái)運(yùn)行它
這意味此進(jìn)程在容器中的PID不能為1,不能接收Unix信號(hào),因此,當(dāng)使用docker stop命令
來(lái)停止容器時(shí),此進(jìn)程接收不到信號(hào)

第二種語(yǔ)法格式中的參數(shù)是一個(gè)JSON格式的數(shù)組,其中<executable>為要運(yùn)行的命令,后面的
<paramN>為傳遞給命令的選項(xiàng)或參數(shù),然而,此種格式指定的命令不會(huì)以"/bin/sh -c">來(lái)運(yùn)行它
因此常見(jiàn)的shell操作如變量替換以及通配符替換將不會(huì)進(jìn)行 不過(guò)如果要運(yùn)行的命令依賴于
此shell特性的話,可以將其替換為下面的格式:
RUN ["/bin/bash","-c","<executable>","<param1>"]

........................................................................

10 CMD命令:運(yùn)行于docker run中

語(yǔ)法有三種寫(xiě)法
1. CMD ["executable","param1","param2"] --啟動(dòng)為ID為1的進(jìn)程
具體實(shí)例:

CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html]

2. CMD ["param1","param2"]
3. CMD command param1 param2 --直接運(yùn)營(yíng)為shell的子進(jìn)程
param*=執(zhí)行參數(shù)
例如第二種:
CMD ["nginx"]

docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx

只能是雙引號(hào)!

CMD ["param1","param2"]
 --此種用法用于為ENTRYPOINT指令提供默認(rèn)參數(shù)

可用于執(zhí)行腳本:
添加腳本:

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指令的功能,用于為容器指定默認(rèn)運(yùn)行程序,從而使得容器像是一個(gè)單獨(dú)
的可執(zhí)行程序

與CND不同的是,由這個(gè)指令啟動(dòng)的程序不會(huì)被docker run 命令行指定的參數(shù)所覆蓋
而且,這些命令行參數(shù)會(huì)被當(dāng)做參數(shù)傳遞給ENTRYPOINT指定的程序

使用格式:

ENTRYPOINT <command>
ENTRYPOINT ["<executable>","<param1>","<param2>"]

docker run 命令傳入的命令參數(shù)會(huì)覆蓋CMD指定的內(nèi)容并且附加到ENTRYPOINT
命令最后作為其參數(shù)使用

Dockerfile文件中也可以存在多個(gè)此指令,但僅有最后一個(gè)生效!

在docker run時(shí),使用--entrypoint string選項(xiàng)傳遞的命令 可以覆蓋Dockerfile中
定義的ENTRYPOINT指令

如何讓Nginx配置文件接收參數(shù)

創(chuàng)建一個(gè)腳本:

#!/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]

注意:必須使用雙引號(hào)?。?!
................................................................................

12 USER命令:

用于指定運(yùn)行image時(shí)的或運(yùn)行Dockerfile中的任何RUN,CMD或ENTRYPOINT
指令指定的程序時(shí)的用戶名或UID

默認(rèn)情況下,container的運(yùn)行身份為root

格式:
USER <UID>|<UserName>

需要注意的是<UID>可以為任意數(shù)字,但實(shí)踐中其必須為/etc/passwd中某用戶的有效
UID否則docker run命令將運(yùn)行失??!

必須要在容器中的/etc/passwd文件中個(gè)存在

....................................................................

13 HEALTHCHECK

健康狀態(tài)監(jiān)測(cè)
HEALTHCHECK NONE --不要做監(jiān)測(cè)

常用選項(xiàng):
--interval=DURATION 默認(rèn)30秒 --多長(zhǎng)時(shí)間監(jiān)測(cè)一次
--timeout=DURATION 默認(rèn)30秒 --監(jiān)測(cè)超時(shí)時(shí)間
--start-period=DURATION --當(dāng)docker容器啟動(dòng)后,延遲多長(zhǎng)時(shí)間才健康檢查
默認(rèn)0秒
--retries=N 默認(rèn)3次
默認(rèn)檢查多少次在認(rèn)為失敗

響應(yīng)值:
0--成功
1--失敗
2--自定義

應(yīng)用示例:

HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit1

Dockerfile中應(yīng)用:

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 信號(hào)名稱

定義停止命令的信號(hào)!

SIGKILL --9信號(hào)

.............................................................

16 ARG參數(shù):

用于docker build 的過(guò)程中使用

可以被--buil-arg當(dāng)做參數(shù)傳遞過(guò)來(lái)!
具體應(yīng)用:

ARG auther=tim
LABLE maintainer=${auther}
docker build --build-arg auther=tom -t xxx ./

在dockerfile中存在的arg變量,如果在docker build 時(shí)也
設(shè)置了--build-arg變量,這樣最終以命令行界面的變量值為
最終值!
.................................................................

17 ONBUILD

用于在dockerfile中定義一個(gè)觸發(fā)器
dockerfile用于build映像文件,此映像文件亦可作為base image被另一個(gè)
dockerfile用作from指定的參數(shù),并以之構(gòu)建新的影響文件

在后面的這個(gè)dockerfile中的from指定在build過(guò)程中被執(zhí)行時(shí),將會(huì)觸發(fā)
創(chuàng)建其base image的dockerfile文件的ONBUILD指定定義的觸發(fā)器

格式:
ONBUILD 要執(zhí)行的Dockerfile指令

盡管任何指令都可注冊(cè)成為觸發(fā)器指令,但ONBUILD不能自我嵌套
且不會(huì)觸發(fā)from和maintainer指令

使用包含onbuild指定的dockerfile構(gòu)建的鏡像應(yīng)該使用特殊的標(biāo)簽
例如ruby:2.0-onbuild

在onbuild指令中使用add或copy指令硬格外小心,因?yàn)闃?gòu)建過(guò)程的上下文
在缺少指定的源文件時(shí)會(huì)失??!

關(guān)于如何正確的使用Dockerfile命令就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI