使用 Dockerfile 創建鏡像


簡介

  Dockerfile是一個文本格式的配置文件,用戶可以使用Dockerfile快速創建自定義的鏡像。
  本文首先將介紹Dockerfile典型的基本結構及其支持的眾多指令,並具體講解通過這些指令來編寫定制鏡像的Dockerfile。
  最后,會介紹使用Dockerfile創建鏡像的過程。

基本結構

  Dockerfile由一行行命令語句組成,並且支持以#開頭的注釋行。
  一般而言,Dockerfile分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。例如:

# 第一行必須指定基於的基礎鏡像
FROM ubuntu

# 維護者信息
MAINTAINER docker_user docker_user@email.com

# 鏡像的操作指令
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

# 容器啟動時執行命令
CMD /usr/sbin/nginx

  其中,一開始必須指明所基於的鏡像名稱,接下來一般會說明維護者信息。
  后面則是鏡像操作指令,例如RUN指令,RUN指令將對鏡像執行跟隨的命令。每運行一條RUN指令,鏡像添加新的一層,並提交。最后是CMD指令,來指定運行容器時的操作命令。

指令

  指令的一般格式為INSTRUCTION arguments,指令包括FROM、MAINTAINER、RUN等。下面分別介紹。

FROM

  格式為 FROM<image> 或 FROM<image>:<tag>。
  第一條指令必須為FROM指令。並且,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個FROM指令(每個鏡像一次)。

MAINTAINER

  格式為 MAINTAINER<name>,指定維護者信息。

RUN

  格式為 RUN<command> 或 RUN["executable","param1","param2"]。
  前者將在shell終端中運行命令,即 /bin/sh -c ;后者則使用exec執行。指定使用其他終端可以通過第二種方式實現,例如 RUN["/bin/bash","-c","echo hel1o"] 。
  每條RUN指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用\來換行。

CMD

  支持三種格式:

  1. CMD["executable","param1","param2"]使用exec執行,推薦方式。
  2. CMD command paraml param2在/bin/sh中執行,提供給需要交互的應用。
  3. CMD["param1","param2"]提供給ENTRYPOINT的默認參數。

  指定啟動容器時執行的命令,每個Dockerfile只能有一條CMD命令。如果指定了多條命令,只有最后一條會被執行。
  如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉CMD指定的命令。

EXPOSE

  格式為 EXPOSE <port> [<port>...] 。
  例如:
  EXPOSE 2280 8443
  告訴Docker服務端容器暴露的端口號,供互聯系統使用。在啟動容器時需要通過-P,Docker主機會自動分配一個端口轉發到指定的端口;使用-p,則可以具體指定哪個本地端口映射過來。

ENV

  格式為 ENV <key> <value>。指定一個環境變量,會被后續RUN指令使用,並在容器運行時保持。例如:
  ENV PG MAJOR 9.3
  ENV PG VERSION 9.3.4
  RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz I tar -xJC /usr/
src/postgress && …
  ENV PATH/usr/local/postgres-$PG_MAJOR/bin:SPATH

ADD

  格式為ADD <src> <dest>。
  該命令將復制指定的<src>到容器中的<dest>。其中<src>可以是Dockerfile所在目錄的一個相對路徑(文件或目錄);也可以是一個URL;還可以是一個tar文件(自動解壓為目錄)。

COPY

  格式為COPY <src> <dest>。
  復制本地主機的<src>(為Dockerfile所在目錄的相對路徑,文件或目錄)為容器中的<dest>。目標路徑不存在時,會自動創建。
  當使用本地目錄為源目錄時,推薦使用COPY。

ENTRYPOINT

  有兩種格式:
  ENTRYPOINT["executable","paraml","param2"]
  ENTRYPOINT command paraml param2(shell中執行)。
  配置容器啟動后執行的命令,並且不可被 docker run提供的參數覆蓋。
  每個Dockerfile中只能有一個ENTRYPOINT,當指定多個ENTRYPOINT時,只有最后一個生效。

VOLUME

  格式為VOLUME["/data"]。
  創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。

USER

  格式為USER daemon。
  指定運行容器時的用戶名或UID,后續的RUN也會使用指定用戶。
  當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員權限可以使用gosu,而不推薦sudo。

WORKDIR

  格式為WORKDIR /path/to/workdir。
  為后續的RUN、CMD、ENTRYPOINT指令配置工作目錄。
  可以使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基於之前命令指定的路徑。例如:
  WORKDIR/a
  WORKDIR b
  WORKDIR c
  RUN pwd
  則最終路徑為/a/b/c。

ONBUILD

  格式為 ONBUILD [INSTRUCTION]。
  配置當所創建的鏡像作為其他新創建鏡像的基礎鏡像時,所執行的操作指令。例如,Dockerfile使用如下的內容創建了鏡像image-A。
  [...]
  ONBUILD ADD./app/src
  ONBUILD RUN/usr/1ocal/bin/python-build--dir/app/sre
  [...]
  如果基於image-A創建新的鏡像時,新的Dockerfile中使用 FROM image-A 指定基礎鏡像時,會自動執行ONBUILD指令內容,等價於在后面添加了兩條指令。
  EROM image-A
  #Automatically run the following
  ADD./app/src
  RUN/usr/local/bin/python-build--dir/app/src
  使用ONBUILD指令的鏡像,推薦在標簽中注明,例如ruby:1.9-onbuild。

創建鏡像

  編寫完成Dockerfile之后,可以通過docker build命令來創建鏡像。
  基本的格式為docker build [選項]路徑,該命令將讀取指定路徑下(包括子目錄)的Dockerfile,並將該路徑下所有內容發送給Docker服務端,由服務端來創建鏡像。因此一般建議放置Dockerfile的目錄為空目錄。
  另外,可以通過.dockerignore文件(每一行添加一條匹配模式)來讓Docker忽略路徑下的目錄和文件。
  要指定鏡像的標簽信息,可以通過-t選項。
  例如,指定Dockerfile所在路徑為/tmp/docker_builder/,並且希望生成鏡像標簽為build_repo/first_image,可以使用下面的命令:

  & sudo docker build -t build_repo/first_image /tmp/docker_builder/

 

1 學習本是一個不斷抄襲、模仿、練習、創新的過程。
2 對於自己,博文只是總結。在總結的過程發現問題,解決問題。
3 對於他人,在此過程如果還能附帶幫助他人,那就再好不過了。
4 由於博主能力有限,文中可能存在描述不正確,歡迎指正、補充!
5 感謝您的閱讀。如果文章對您有用,那么請輕輕點個贊,以資鼓勵。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM