最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Dockerfile中指令的介紹和使用

1、Dockerfile基本結(jié)構(gòu)

Dockerfile是一個包含用于組合映像的命令的文本文檔??梢允褂迷诿钚兄姓{(diào)用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。

成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、網(wǎng)站設(shè)計網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元復(fù)興做網(wǎng)站,已為上家服務(wù),為復(fù)興各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

Dockerfile由一行行命令語句組成,并且支持以#開頭的注釋行。

一般Dockerfile分為四部分:基礎(chǔ)鏡像信息、維護(hù)者信息、鏡像操作指令和容器啟動時執(zhí)行指令。如下:

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: Ray
# Command format: Instruction [arguments / command] ..

# Maintainer: docker_user  (@docker_user)
MAINTAINER Ray [email protected]

# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
CMD /usr/sbin/nginx

其中,一開始必須指明所基于的鏡像,接下來推薦說明維護(hù)者信息,再接下來就是鏡像操作的指令,如RUN、COPY等。每運(yùn)行一條指令,就會為鏡像添加新的一層并提交,注:一個鏡像最多不允許超過127層。最后時CMD指令,是指定運(yùn)行容器時的操作指令。

2、Dockerfile中的指令

Docker通過對于在Dockerfile中的一系列指令的順序解析實(shí)現(xiàn)自動的image的構(gòu)建
通過使用build命令,根據(jù)Dockerfiel的描述來構(gòu)建鏡像
通過源代碼路徑的方式
通過標(biāo)準(zhǔn)輸入流的方式

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

格式為:FROM 或者 FROM :。

第一條指令必須為FROM指令,如果在同一個dockerfile中創(chuàng)建多個鏡像時,可以使用多個FROM指令(每個鏡像一次,但是一般不會這么做)。

2)MAINTAINER——指定維護(hù)者信息

格式為:MAINTAINER 。用來指定維護(hù)者信息。

3)RUN——運(yùn)行指令

格式為:RUN 或者RUN ["executable", "param1", "param2"]。

前者將在 shell 終端中運(yùn)行命令,即 /bin/sh -c;后者則使用 exec 執(zhí)行。指定使用其它終端可以通過第二種方式實(shí)現(xiàn),例如 RUN ["/bin/bash", "-c", "echo hello"]。

每條 RUN 指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令,并提交為新的鏡像。當(dāng)命令較長時可以使用 \ 來換行。(注:如果覺得鏡像的層數(shù)可能過多,可以一個RUN指令后面接多條指令,中間使用&&進(jìn)行拼接即可)。

4)COPY——復(fù)制文件\目錄

格式為:格式為 COPY 。

作用:復(fù)制本地的 (源文件/目錄必須要與Dockerfile在相同的目錄中)到容器中的。

當(dāng)使用本地目錄為源目錄時,推薦使用COPY。

使用COPY時,所指定的源文件/目錄,也可以是其他鏡像中的文件,格式如下:

COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
5)ADD——更高級的復(fù)制文件\目錄

格式為:ADD 。它和COPY很相似,同樣需要源文件和Dockerfile位于相同目錄中,或者是一個URL。它比COPY更為人性化些。

該命令將復(fù)制指定的 到容器中的 。 其中 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL(自動下載URL所對應(yīng)的文件);還可以是一個 tar 文件(自動解壓為目錄)。

在使用該指令的時候還可以加上 --chown=: 選項(xiàng)來改變文件的所屬用戶及所屬組。

ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/

ADD 指令會令鏡像構(gòu)建緩存失效,從而可能會令鏡像構(gòu)建變得比較緩慢。

但在某些情況下,如果我們真的是希望復(fù)制個壓縮文件進(jìn)去,而不解壓縮,這時就不可以使用 ADD 命令了。

因此在 COPY 和 ADD 指令中選擇的時候,可以遵循這樣的原則,所有的文件復(fù)制均使用 COPY 指令,僅在需要自動解壓縮的場合使用 ADD。

6)ENV——設(shè)置環(huán)境變量

格式為 ENV 。 指定一個環(huán)境變量,會被后續(xù) RUN 指令使用,并在容器運(yùn)行時保持。

舉個栗子:

[root@master nginx]# cat Dockerfile 
# test
FROM nginx:latest
MAINTAINER Ray <[email protected]>
ENV var1 hello world
ENV var2 test
RUN echo ${var1},${var2} > /test.txt
#最終此鏡像運(yùn)行的容器中test.txt文件內(nèi)容如下:
root@262f47a7682a:/# cat test.txt 
hello world,test
#并且定義的變量存在該容器的環(huán)境變量中:
root@262f47a7682a:/# echo $var1
hello world
root@262f47a7682a:/# echo $var2
test
7)ARG——構(gòu)建參數(shù)

格式:ARG <參數(shù)名>[=<默認(rèn)值>]

構(gòu)建參數(shù)和 ENV 的效果一樣,都是設(shè)置環(huán)境變量。所不同的是,ARG 所設(shè)置的構(gòu)建環(huán)境的環(huán)境變量,在將來容器運(yùn)行時是不會存在這些環(huán)境變量的。但是不要因此就使用 ARG 保存密碼之類的信息,因?yàn)?docker history 還是可以看到所有值的。

Dockerfile 中的 ARG 指令是定義參數(shù)名稱,以及定義其默認(rèn)值。該默認(rèn)值可以在構(gòu)建命令 docker build 中用 --build-arg <參數(shù)名>=<值> 來覆蓋。

在 1.13 之前的版本,要求 --build-arg 中的參數(shù)名,必須在 Dockerfile 中用 ARG 定義過了,換句話說,就是 --build-arg 指定的參數(shù),必須在 Dockerfile 中使用了。如果對應(yīng)參數(shù)沒有被使用,則會報錯退出構(gòu)建。從 1.13 開始,這種嚴(yán)格的限制被放開,不再報錯退出,而是顯示警告信息,并繼續(xù)構(gòu)建。這對于使用 CI 系統(tǒng),用同樣的構(gòu)建流程構(gòu)建不同的 Dockerfile 的時候比較有幫助,避免構(gòu)建命令必須根據(jù)每個 Dockerfile 的內(nèi)容修改。

8)EXPOSE——暴露端口

格式為:EXPOSE [...]。

該指令的作用是告訴docker服務(wù)端容器暴露的端口號,供互聯(lián)系統(tǒng)使用,在啟動容器時需要通過-P,docker主機(jī)會自動分配一個端口轉(zhuǎn)發(fā)到指定的端口。

9)CMD——容器啟動命令

它支持以下三種格式:

  • CMD ["executable","param1","param2"] 使用 exec 執(zhí)行,推薦方式;
  • CMD command param1 param2 在 /bin/sh 中執(zhí)行,提供給需要交互的應(yīng)用;
  • CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認(rèn)參數(shù);

作用是指定啟動容器時執(zhí)行的命令,每個dockerfile只有一條CMD命令,如果指定了多條,那么前面的會被覆蓋,只有最后一條指令生效。

如果用戶啟動容器時指定了運(yùn)行的命令,則會覆蓋掉CMD指定的命令。

如下:

[root@master nginx]# cat Dockerfile    #dockerfile內(nèi)容如下
# test
FROM nginx:latest
CMD echo hello world
CMD echo hello 
[root@master nginx]# docker run -t  ljz:v2    #只有最后一條CMD指令生效
hello
[root@master nginx]# docker run -t  ljz:v2 echo 123456    
#啟動容器時又指定了其他指令,則會覆蓋掉dockerfile中的所有指令
123456

一般我將CMD和ENTRYPOINT結(jié)合使用。也就是上面的第三種格式。

10)ENTRYPOINT——入口點(diǎn)

它支持下面兩種格式:

  • ENTRYPOINT ["executable", "param1", "param2"];
  • ENTRYPOINT command param1 param2(shell中執(zhí)行)。

配置容器啟動后執(zhí)行的命令,并且不可被docker run提供的參數(shù)覆蓋。

每個dockerfile中只能有一個ENTRYPOINT ,當(dāng)指定多個時,只有最后一個起效。

使用舉例:

[root@master nginx]# cat Dockerfile        #dokerfile文件如下
# test
FROM nginx:latest
ENTRYPOINT echo hello world
ENTRYPOINT echo hello 
[root@master nginx]# docker run -t ljz:v3      #運(yùn)行此鏡像
hello
[root@master nginx]# docker run -t ljz:v3 echo 123456    #運(yùn)行時指定的命令也不會被執(zhí)行
hello
#但是可以通過“--entrypoint”指令將鏡像中的ENTRYPOINT指令覆蓋,只能是命令字
[root@master nginx]# docker run  --entrypoint hostname -t ljz:v3
afb421b81a7d
11)ENTRYPOINT和CMD組合使用

在某種情況下,ENTRYPOINT和CMD組合使用能發(fā)揮更大的作用。

組合使用ENTRYPOINT和CMD, ENTRYPOINT指定默認(rèn)的運(yùn)行命令, CMD指定默認(rèn)的運(yùn)行參數(shù)。

舉個栗子:

[root@master nginx]# cat Dockerfile     #Dockerfile文件如下
# test
FROM centos:7
ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"]
[root@master nginx]# docker run -t ljz:v4     #運(yùn)行容器
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.074 ms

查看容器最后一條執(zhí)行的命令如下:

Dockerfile中指令的介紹和使用

上面執(zhí)行的命令是ENTRYPOINT和CMD指令拼接而成. ENTRYPOINT和CMD同時存在時, docker把CMD的命令拼接到ENTRYPOINT命令之后, 拼接后的命令才是最終執(zhí)行的命令. 但是由于上文說docker run命令行執(zhí)行時, 可以覆蓋CMD指令的值. 如果你希望這個docker鏡像啟動后不是ping localhost, 而是ping其他服務(wù)器,, 可以這樣執(zhí)行docker run:

Dockerfile中指令的介紹和使用

下表列出了如果把Shell表示法和Exec表示法混合, 最終得到的命令行, 可以看到如果有Shell表示法存在, 很難得到正確的效果:

Dockerfile    Command

ENTRYPOINT /bin/ping -c 3
CMD localhost    
#拼接后的指令如下:
 /bin/sh -c '/bin/ping -c 3' /bin/sh -c localhost

ENTRYPOINT ["/bin/ping","-c","3"]
CMD localhost               
#拼接后的指令如下:
/bin/ping -c 3 /bin/sh -c localhost

ENTRYPOINT /bin/ping -c 3
CMD ["localhost"]"         
#拼接后的指令如下:
/bin/sh -c '/bin/ping -c 3' localhost

ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"]            
#拼接后的指令如下:
/bin/ping -c 3 localhost

從上面看出, 只有ENTRYPOINT和CMD都用Exec表示法, 才能得到預(yù)期的效果。

12)VOLUME——定義匿名卷

容器運(yùn)行時應(yīng)該盡量保持容器存儲層不發(fā)生寫操作,對于數(shù)據(jù)庫類需要保存動態(tài)數(shù)據(jù)的應(yīng)用,其數(shù)據(jù)庫文件應(yīng)該保存于卷(volume)中,為了防止運(yùn)行時用戶忘記將動態(tài)文件所保存目錄掛載為卷,在 Dockerfile 中,可以事先指定某些目錄掛載為匿名卷,這樣在運(yùn)行時如果用戶不指定掛載,其應(yīng)用也可以正常運(yùn)行,不會向容器存儲層寫入大量數(shù)據(jù)。

指令格式為:VOLUME ["/data"]。

作用:/data 目錄就會在運(yùn)行時自動掛載為匿名卷,任何向 /data 中寫入的信息都不會記錄進(jìn)容器存儲層,從而保證了容器存儲層的無狀態(tài)化。當(dāng)然,運(yùn)行時可以覆蓋這個掛載設(shè)置。比如:

docker run -d -v mydata:/data xxxx

在這行命令中,就使用了 mydata 這個命名卷掛載到了 /data 這個位置,替代了 Dockerfile 中定義的匿名卷的掛載配置。

這種方式是docker manager volumes數(shù)據(jù)持久化方式,不支持Bind mount掛載方式(也就是不支持指定本地的目錄)。

在基于鏡像運(yùn)行容器后,可以通過命令“docker inspect  container_name”查看容器的詳細(xì)信息,在返回的結(jié)果中,查看MOUNT字段可以看到容器內(nèi)對應(yīng)的本地目錄位置,如下:

[root@master volumes]# docker inspect web02

返回的結(jié)果如下:

Dockerfile中指令的介紹和使用

13)USER——指定當(dāng)前用戶

命令格式為:USER <用戶名>[:<用戶組>]。

指定運(yùn)行容器時的用戶名或 UID,后續(xù)的 RUN 也會使用指定用戶。

USER 指令和 WORKDIR 相似,都是改變環(huán)境狀態(tài)并影響以后的層。WORKDIR 是改變工作目錄,USER 則是改變之后層的執(zhí)行 RUN, CMD 以及 ENTRYPOINT 這類命令的身份。

當(dāng)然,和 WORKDIR 一樣,USER 只是幫助你切換到指定用戶而已,這個用戶必須是事先建立好的,否則無法切換。

RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [ "redis-server" ]

如果以 root 執(zhí)行的腳本,在執(zhí)行期間希望改變身份,比如希望以某個已經(jīng)建立好的用戶來運(yùn)行某個服務(wù)進(jìn)程,不要使用 su 或者 sudo,這些都需要比較麻煩的配置,而且在 TTY 缺失的環(huán)境下經(jīng)常出錯。建議使用 gosu。

# 建立 redis 用戶,并使用 gosu 換另一個用戶執(zhí)行命令
RUN groupadd -r redis && useradd -r -g redis redis
# 下載 gosu
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-amd64" \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true
# 設(shè)置 CMD,并以另外的用戶執(zhí)行
CMD [ "exec", "gosu", "redis", "redis-server" ]
14)WORKDIR——指定工作目錄

格式為:WORKDIR /path/to/workdir。

為后續(xù)的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。

可以使用多個 WORKDIR 指令,后續(xù)命令如果參數(shù)是相對路徑,則會基于之前命令指定的路徑。例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

則最終路徑為 /a/b/c。

15)ONBUILD——為他人做嫁衣

格式為:ONBUILD [INSTRUCTION]。

配置當(dāng)所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時,所執(zhí)行的操作指令。

例如,Dockerfile 使用如下的內(nèi)容創(chuàng)建了鏡像 image-A。

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

如果基于 image-A 創(chuàng)建新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎(chǔ)鏡像時,會自動執(zhí)行ONBUILD 指令內(nèi)容,等價于在后面添加了兩條指令。

FROM image-A

#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的鏡像,推薦在標(biāo)簽中注明,例如 ruby:1.9-onbuild。


網(wǎng)站欄目:Dockerfile中指令的介紹和使用
分享路徑:http://fisionsoft.com.cn/article/jihoed.html