自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Docker(三):Dockerfile 命令詳解

云計算
FROM 指令用于指定其后構(gòu)建新鏡像所使用的基礎(chǔ)鏡像。FROM 指令必是 Dockerfile 文件中的首條命令,啟動構(gòu)建流程后,Docker 將會基于該鏡像構(gòu)建新鏡像,F(xiàn)ROM 后的命令也會基于這個基礎(chǔ)鏡像。

上一篇文章Docker(二):Dockerfile 使用介紹介紹了 Dockerfile 的使用,這篇文章我們來繼續(xù)了解 Dockerfile ,學習 Dockerfile 各種命令的使用。

Dockerfile 指令詳解

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

FROM 指令用于指定其后構(gòu)建新鏡像所使用的基礎(chǔ)鏡像。FROM 指令必是 Dockerfile 文件中的首條命令,啟動構(gòu)建流程后,Docker 將會基于該鏡像構(gòu)建新鏡像,F(xiàn)ROM 后的命令也會基于這個基礎(chǔ)鏡像。

[[227061]]

FROM語法格式為:

  1. FROM <image> 

  1. FROM <image>:<tag> 

  1. FROM <image>:<digest> 

通過 FROM 指定的鏡像,可以是任何有效的基礎(chǔ)鏡像。FROM 有以下限制:

  • FROM 必須 是 Dockerfile 中第一條非注釋命令
  • 在一個 Dockerfile 文件中創(chuàng)建多個鏡像時,F(xiàn)ROM 可以多次出現(xiàn)。只需在每個新命令 FROM 之前,記錄提交上次的鏡像 ID。
  • tag 或 digest 是可選的,如果不使用這兩個值時,會使用 latest 版本的基礎(chǔ)鏡像

2 RUN 執(zhí)行命令

在鏡像的構(gòu)建過程中執(zhí)行特定的命令,并生成一個中間鏡像。格式:

  1. #shell格式 
  2. RUN <command> 
  3. #exec格式 
  4. RUN ["executable""param1""param2"
  • RUN 命令將在當前 image 中執(zhí)行任意合法命令并提交執(zhí)行結(jié)果。命令執(zhí)行提交后,就會自動執(zhí)行 Dockerfile 中的下一個指令。
  • 層級 RUN 指令和生成提交是符合 Docker 核心理念的做法。它允許像版本控制那樣,在任意一個點,對 image 鏡像進行定制化構(gòu)建。
  • RUN 指令創(chuàng)建的中間鏡像會被緩存,并會在下次構(gòu)建中使用。如果不想使用這些緩存鏡像,可以在構(gòu)建時指定 --no-cache 參數(shù),如: docker build --no-cache。

3 COPY 復制文件

格式:

  1. COPY <源路徑>... <目標路徑> 
  2. COPY ["<源路徑1>",... "<目標路徑>"

和 RUN 指令一樣,也有兩種格式,一種類似于命令行,一種類似于函數(shù)調(diào)用。COPY 指令將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復制到新的一層的鏡像內(nèi)的 <目標路徑>位置。比如:

  1. COPY package.json /usr/src/app/ 

<源路徑>可以是多個,甚至可以是通配符,其通配符規(guī)則要滿足 Go 的 filepath.Match 規(guī)則,如:

  1. COPY hom* /mydir/ 
  2. COPY hom?.txt /mydir/ 

<目標路徑>可以是容器內(nèi)的絕對路徑,也可以是相對于工作目錄的相對路徑(工作目錄可以用 WORKDIR 指令來指定)。目標路徑不需要事先創(chuàng)建,如果目錄不存在會在復制文件前先行創(chuàng)建缺失目錄。

此外,還需要注意一點,使用 COPY 指令,源文件的各種元數(shù)據(jù)都會保留。比如讀、寫、執(zhí)行權(quán)限、文件變更時間等。這個特性對于鏡像定制很有用。特別是構(gòu)建相關(guān)文件都在使用 Git 進行管理的時候。

4 ADD 更高級的復制文件

ADD 指令和 COPY 的格式和性質(zhì)基本一致。但是在 COPY 基礎(chǔ)上增加了一些功能。比如 <源路徑>可以是一個 URL,這種情況下,Docker 引擎會試圖去下載這個鏈接的文件放到 <目標路徑>去。

在構(gòu)建鏡像時,復制上下文中的文件到鏡像內(nèi),格式:

  1. ADD <源路徑>... <目標路徑>  
  2. ADD ["<源路徑>",... "<目標路徑>"

注意 

如果 docker 發(fā)現(xiàn)文件內(nèi)容被改變,則接下來的指令都不會再使用緩存。關(guān)于復制文件時需要處理的/,基本跟正常的 copy 一致

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

格式有兩種:

  1. ENV <key> <value> 
  2. ENV <key1>=<value1> <key2>=<value2>... 

這個指令很簡單,就是設(shè)置環(huán)境變量而已,無論是后面的其它指令,如 RUN,還是運行時的應(yīng)用,都可以直接使用這里定義的環(huán)境變量。

  1. ENV VERSION=1.0 DEBUG=on \ 
  2.  NAME="Happy Feet" 

這個例子中演示了如何換行,以及對含有空格的值用雙引號括起來的辦法,這和 Shell 下的行為是一致的。

6 EXPOSE

為構(gòu)建的鏡像設(shè)置監(jiān)聽端口,使容器在運行時監(jiān)聽。格式:

  1. EXPOSE <port> [<port>...] 

EXPOSE 指令并不會讓容器監(jiān)聽 host 的端口,如果需要,需要在 docker run 時使用 -p、 -P 參數(shù)來發(fā)布容器端口到 host 的某個端口上。

7 VOLUME 定義匿名卷

VOLUME用于創(chuàng)建掛載點,即向基于所構(gòu)建鏡像創(chuàng)始的容器添加卷:

VOLUME ["/data"]

一個卷可以存在于一個或多個容器的指定目錄,該目錄可以繞過聯(lián)合文件系統(tǒng),并具有以下功能:

  • 卷可以容器間共享和重用
  • 容器并不一定要和其它容器共享卷
  • 修改卷后會立即生效
  • 對卷的修改不會對鏡像產(chǎn)生影響
  • 卷會一直存在,直到?jīng)]有任何容器在使用它

VOLUME 讓我們可以將源代碼、數(shù)據(jù)或其它內(nèi)容添加到鏡像中,而又不并提交到鏡像中,并使我們可以多個容器間共享這些內(nèi)容。

8 WORKDIR 指定工作目錄

WORKDIR用于在容器內(nèi)設(shè)置一個工作目錄:

  1. WORKDIR /path/to/workdir 

通過WORKDIR設(shè)置工作目錄后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都會在該目錄下執(zhí)行。 如,使用WORKDIR設(shè)置工作目錄:

  1. WORKDIR /a 
  2. WORKDIR b 
  3. WORKDIR c 
  4. RUN pwd 

在以上示例中,pwd 最終將會在 /a/b/c 目錄中執(zhí)行。在使用 docker run 運行容器時,可以通過 -w參數(shù)覆蓋構(gòu)建時所設(shè)置的工作目錄。

9 USER 指定當前用戶

USER 用于指定運行鏡像所使用的用戶:

  1. USER daemon 

使用USER指定用戶時,可以使用用戶名、UID 或 GID,或是兩者的組合。以下都是合法的指定試:

  1. USER user 
  2. USER user:group 
  3. USER uid 
  4. USER uid:gid 
  5. USER user:gid 
  6. USER uid:group 

使用USER指定用戶后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT 都將使用該用戶。鏡像構(gòu)建完成后,通過 docker run 運行容器時,可以通過 -u 參數(shù)來覆蓋所指定的用戶。

10 CMD

CMD用于指定在容器啟動時所要執(zhí)行的命令。CMD 有以下三種格式:

  1. CMD ["executable","param1","param2"
  2. CMD ["param1","param2"
  3. CMD command param1 param2 

省略可執(zhí)行文件的 exec 格式,這種寫法使 CMD 中的參數(shù)當做 ENTRYPOINT 的默認參數(shù),此時 ENTRYPOINT 也應(yīng)該是 exec 格式,具體與 ENTRYPOINT 的組合使用,參考 ENTRYPOINT。

注意 

與 RUN 指令的區(qū)別:RUN 在構(gòu)建的時候執(zhí)行,并生成一個新的鏡像,CMD 在容器運行的時候執(zhí)行,在構(gòu)建時不進行任何操作。

11 ENTRYPOINT

ENTRYPOINT 用于給容器配置一個可執(zhí)行程序。也就是說,每次使用鏡像創(chuàng)建容器時,通過 ENTRYPOINT 指定的程序都會被設(shè)置為默認程序。ENTRYPOINT 有以下兩種形式:

  1. ENTRYPOINT ["executable""param1""param2"
  2. ENTRYPOINT command param1 param2 

ENTRYPOINT 與 CMD 非常類似,不同的是通過 docker run執(zhí)行的命令不會覆蓋 ENTRYPOINT,而 docker run命令中指定的任何參數(shù),都會被當做參數(shù)再次傳遞給 ENTRYPOINT。Dockerfile 中只允許有一個 ENTRYPOINT 命令,多指定時會覆蓋前面的設(shè)置,而只執(zhí)行最后的 ENTRYPOINT 指令。

docker run運行容器時指定的參數(shù)都會被傳遞給 ENTRYPOINT ,且會覆蓋 CMD 命令指定的參數(shù)。如,執(zhí)行 docker run <image> -d時,-d 參數(shù)將被傳遞給入口點。

也可以通過 docker run --entrypoint重寫 ENTRYPOINT 入口點。如:可以像下面這樣指定一個容器執(zhí)行程序:

  1. ENTRYPOINT ["/usr/bin/nginx"

完整構(gòu)建代碼:

  1. # Version: 0.0.3 
  2. FROM ubuntu:16.04 
  3. MAINTAINER 何民三 "cn.liuht@gmail.com" 
  4. RUN apt-get update 
  5. RUN apt-get install -y nginx 
  6. RUN echo 'Hello World, 我是個容器' \ 
  7.  > /var/www/html/index.html 
  8. ENTRYPOINT ["/usr/sbin/nginx"
  9. EXPOSE 80 

使用docker build構(gòu)建鏡像,并將鏡像指定為 itbilu/test:

  1. docker build -t="itbilu/test" . 

構(gòu)建完成后,使用itbilu/test啟動一個容器:

  1. docker run -i -t itbilu/test -g "daemon off;" 

在運行容器時,我們使用了 -g "daemon off;",這個參數(shù)將會被傳遞給 ENTRYPOINT,最終在容器中執(zhí)行的命令為 /usr/sbin/nginx -g "daemon off;"。

12 LABEL

LABEL用于為鏡像添加元數(shù)據(jù),元數(shù)以鍵值對的形式指定:

  1. LABEL <key>=<value> <key>=<value> <key>=<value> ... 

使用LABEL指定元數(shù)據(jù)時,一條LABEL指定可以指定一或多條元數(shù)據(jù),指定多條元數(shù)據(jù)時不同元數(shù)據(jù)之間通過空格分隔。推薦將所有的元數(shù)據(jù)通過一條LABEL指令指定,以免生成過多的中間鏡像。 如,通過LABEL指定一些元數(shù)據(jù):

LABEL version="1.0" description="這是一個Web服務(wù)器" by="IT筆錄"

指定后可以通過docker inspect查看:

  1. docker inspect itbilu/test 
  2. "Labels": { 
  3.  "version""1.0"
  4.  "description""這是一個Web服務(wù)器"
  5.  "by""IT筆錄" 
  6. }, 

13 ARG

ARG用于指定傳遞給構(gòu)建運行時的變量:

  1. ARG <name>[=<default value>] 

如,通過ARG指定兩個變量:

  1. ARG site  
  2. ARG build_user=IT筆錄 

以上我們指定了 site 和 builduser 兩個變量,其中 builduser 指定了默認值。在使用 docker build 構(gòu)建鏡像時,可以通過 --build-arg <varname>=<value> 參數(shù)來指定或重設(shè)置這些變量的值。

  1. docker build --build-arg site=itiblu.com -t itbilu/test . 

這樣我們構(gòu)建了 itbilu/test 鏡像,其中site會被設(shè)置為 itbilu.com,由于沒有指定 build_user,其值將是默認值 IT 筆錄。

14 ONBUILD

ONBUILD用于設(shè)置鏡像觸發(fā)器:

  1. ONBUILD [INSTRUCTION] 

當所構(gòu)建的鏡像被用做其它鏡像的基礎(chǔ)鏡像,該鏡像中的觸發(fā)器將會被鑰觸發(fā)。 如,當鏡像被使用時,可能需要做一些處理:

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

15 STOPSIGNAL

STOPSIGNAL用于設(shè)置停止容器所要發(fā)送的系統(tǒng)調(diào)用信號:

  1. STOPSIGNAL signal 

所使用的信號必須是內(nèi)核系統(tǒng)調(diào)用表中的合法的值,如:SIGKILL。

16 SHELL

SHELL用于設(shè)置執(zhí)行命令(shell式)所使用的的默認 shell 類型:

  1. SHELL ["executable""parameters"

SHELL在Windows環(huán)境下比較有用,Windows 下通常會有 cmd 和 powershell 兩種 shell,可能還會有 sh。這時就可以通過 SHELL 來指定所使用的 shell 類型:

  1. FROM microsoft/windowsservercore 
  2. # Executed as cmd /S /C echo default 
  3. RUN echo default 
  4. # Executed as cmd /S /C powershell -command Write-Host default 
  5. RUN powershell -command Write-Host default 
  6. # Executed as powershell -command Write-Host hello 
  7. SHELL ["powershell""-command"
  8. RUN Write-Host hello 
  9. # Executed as cmd /S /C echo hello 
  10. SHELL ["cmd""/S"", "/C"] 
  11. RUN echo hello 

Dockerfile 使用經(jīng)驗

Dockerfile 示例

構(gòu)建Nginx運行環(huán)境

  1. # 指定基礎(chǔ)鏡像 
  2. FROM sameersbn/ubuntu:14.04.20161014 
  3. # 維護者信息 
  4. MAINTAINER sameer@damagehead.com 
  5. # 設(shè)置環(huán)境 
  6. ENV RTMP_VERSION=1.1.10 \ 
  7.  NPS_VERSION=1.11.33.4 \ 
  8.  LIBAV_VERSION=11.8 \ 
  9.  NGINX_VERSION=1.10.1 \ 
  10.  NGINX_USER=www-data \ 
  11.  NGINX_SITECONF_DIR=/etc/nginx/sites-enabled \ 
  12.  NGINX_LOG_DIR=/var/log/nginx \ 
  13.  NGINX_TEMP_DIR=/var/lib/nginx \ 
  14.  NGINX_SETUP_DIR=/var/cache/nginx 
  15. # 設(shè)置構(gòu)建時變量,鏡像建立完成后就失效 
  16. ARG BUILD_LIBAV=false 
  17. ARG WITH_DEBUG=false 
  18. ARG WITH_PAGESPEED=true 
  19. ARG WITH_RTMP=true 
  20. # 復制本地文件到容器目錄中 
  21. COPY setup/ ${NGINX_SETUP_DIR}/ 
  22. RUN bash ${NGINX_SETUP_DIR}/install.sh 
  23. # 復制本地配置文件到容器目錄中 
  24. COPY nginx.conf /etc/nginx/nginx.conf 
  25. COPY entrypoint.sh /sbin/entrypoint.sh 
  26. # 運行指令 
  27. RUN chmod 755 /sbin/entrypoint.sh 
  28. # 允許指定的端口 
  29. EXPOSE 80/tcp 443/tcp 1935/tcp 
  30. # 指定網(wǎng)站目錄掛載點 
  31. VOLUME ["${NGINX_SITECONF_DIR}"
  32. ENTRYPOINT ["/sbin/entrypoint.sh"
  33. CMD ["/usr/sbin/nginx"

構(gòu)建tomcat 環(huán)境

Dockerfile文件

  1. # 指定基于的基礎(chǔ)鏡像 
  2. FROM ubuntu:13.10 
  3. # 維護者信息 
  4. MAINTAINER zhangjiayang "zhangjiayang@sczq.com.cn" 
  5. # 鏡像的指令操作 
  6. # 獲取APT更新的資源列表 
  7. RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list 
  8. # 更新軟件 
  9. RUN apt-get update 
  10. # Install curl 
  11. RUN apt-get -y install curl 
  12. # Install JDK 7 
  13. RUN cd /tmp && curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz 
  14. RUN mkdir -p /usr/lib/jvm 
  15. RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/ 
  16. Set Oracle JDK 7 as default Java 
  17. RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300 
  18. RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300 
  19. # 設(shè)置系統(tǒng)環(huán)境 
  20. ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/ 
  21. # Install tomcat7 
  22. RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz 
  23. RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/ 
  24. ENV CATALINA_HOME /opt/tomcat7 
  25. ENV PATH $PATH:$CATALINA_HOME/bin 
  26. # 復件tomcat7.sh到容器中的目錄 
  27. ADD tomcat7.sh /etc/init.d/tomcat7 
  28. RUN chmod 755 /etc/init.d/tomcat7 
  29. # Expose ports. 指定暴露的端口 
  30. EXPOSE 8080 
  31. # Define default command. 
  32. ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out 

tomcat7.sh命令文件

  1. export JAVA_HOME=/usr/lib/jvm/java-7-oracle/ 
  2. export TOMCAT_HOME=/opt/tomcat7 
  3. case $1 in 
  4. start) 
  5.  sh $TOMCAT_HOME/bin/startup.sh 
  6. ;; 
  7. stop) 
  8.  sh $TOMCAT_HOME/bin/shutdown.sh 
  9. ;; 
  10. restart) 
  11.  sh $TOMCAT_HOME/bin/shutdown.sh 
  12.  sh $TOMCAT_HOME/bin/startup.sh 
  13. ;; 
  14. esac 
  15. exit 0 

原則與建議

容器輕量化。從鏡像中產(chǎn)生的容器應(yīng)該盡量輕量化,能在足夠短的時間內(nèi)停止、銷毀、重新生成并替換原來的容器。

使用 .gitignore。在大部分情況下,Dockerfile 會和構(gòu)建所需的文件放在同一個目錄中,為了提高構(gòu)建的性能,應(yīng)該使用 .gitignore 來過濾掉不需要的文件和目錄。

為了減少鏡像的大小,減少依賴,僅安裝需要的軟件包。

一個容器只做一件事。解耦復雜的應(yīng)用,分成多個容器,而不是所有東西都放在一個容器內(nèi)運行。如一個 Python Web 應(yīng)用,可能需要 Server、DB、Cache、MQ、Log 等幾個容器。一個更加極端的說法:One process per container。

減少鏡像的圖層。不要多個 Label、ENV 等標簽。

對續(xù)行的參數(shù)按照字母表排序,特別是使用 apt-get install -y安裝包的時候。

使用構(gòu)建緩存。如果不想使用緩存,可以在構(gòu)建的時候使用參數(shù) --no-cache=true來強制重新生成中間鏡像。

【本文為51CTO專欄作者“純潔的微笑”的原創(chuàng)稿件,轉(zhuǎn)載請通過微信公眾號聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2021-09-02 11:55:57

Dockerfile文Linux

2015-07-21 12:43:58

Dockerfile命令實例

2014-11-18 10:37:15

dockerlinux技巧

2018-04-20 15:24:55

DockerfileDocker鏡像

2010-05-24 14:57:10

SVN子命令

2022-05-25 16:48:25

數(shù)據(jù)卷Docker

2022-10-14 07:07:46

架構(gòu)

2023-09-12 08:03:49

容器鏡像

2010-06-24 13:57:57

Linux Cat命令

2021-05-13 23:54:12

DockerDockerfile鏡像

2023-08-04 08:20:56

DockerfileDocker工具

2024-03-06 18:11:06

Docker鏡像技術(shù)

2010-09-02 13:59:53

Linuxfind命令

2012-05-10 08:46:05

Linuxsort命令

2012-05-11 10:07:55

Linuxfind

2012-05-10 08:37:54

Linuxxargs

2014-07-24 11:37:54

LinuxTop命令

2022-09-01 12:17:43

SCSI協(xié)議Linux

2011-09-09 09:29:37

192.168.1.1pingping 192.16

2010-06-23 09:34:15

basename命令
點贊
收藏

51CTO技術(shù)棧公眾號