Docker(三):Dockerfile命令大全

Dockerfile 指令詳解

1. FROM指定基礎鏡像

FROM 指令用於指定其後構建新鏡像所使用的基礎鏡像。FROM 指令必是 Dockerfile 文件中的首條命令,啓動構建流程後,Docker 將會基於該鏡像構建新鏡像,FROM 後的命令也會基於這個基礎鏡像。html

FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>

 

2.RUN執行命令

在鏡像的構建過程當中執行特定的命令,並生成一箇中間鏡像。python

RUN 指令建立的中間鏡像會被緩存,並會在下次構建中使用。若是不想使用這些緩存鏡像,能夠在構建時指定 --no-cache 參數,如:docker build --no-cachenginx

#shell格式
RUN <command>
#exec格式
RUN ["executable", "param1", "param2"]

 

3.COPY複製文件

和 RUN 指令同樣,也有兩種格式,一種相似於命令行,一種相似於函數調用。COPY 指令將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的<目標路徑>位置;git

<源路徑>能夠是多個,甚至能夠是通配符,其通配符規則要知足 Go 的 filepath.Match 規則;docker

COPY 指令,源文件的各類元數據都會保留。好比讀、寫、執行權限、文件變動時間等。shell

COPY package.json /usr/src/app/

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

 

4.ADD高級文件複製

ADD 指令和 COPY 的格式和性質基本一致。可是在 COPY 基礎上增長了一些功能。好比<源路徑>能夠是一個 URL,這種狀況下,Docker 引擎會試圖去下載這個連接的文件放到<目標路徑>去。json

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

 

5.ENV設置環境變量

ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

 

6.EXPOSE

爲構建的鏡像設置監聽端口,使容器在運行時監聽ubuntu

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

 

7.VOLUME定義匿名卷

VOLUME用於建立掛載點,即向基於所構建鏡像創始的容器添加捲:windows

VOLUME ["/data"]

一個卷能夠存在於一個或多個容器的指定目錄,該目錄能夠繞過聯合文件系統,並具備如下功能:緩存

  • 卷能夠容器間共享和重用
  • 容器並不必定要和其它容器共享卷
  • 修改卷後會當即生效
  • 對卷的修改不會對鏡像產生影響
  • 卷會一直存在,直到沒有任何容器在使用它

VOLUME 讓咱們能夠將源代碼、數據或其它內容添加到鏡像中,而又不併提交到鏡像中,並使咱們能夠多個容器間共享這些內容。

8.WORKDIR指定工做目錄

WORKDIR用於在容器內設置一個工做目錄。

經過WORKDIR設置工做目錄後,Dockerfile 中其後的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都會在該目錄下執行。

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

在以上示例中,pwd 最終將會在 /a/b/c 目錄中執行。在使用 docker run 運行容器時,能夠經過-w參數覆蓋構建時所設置的工做目錄。

9.USER指定當前用戶

USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group

使用USER指定用戶後,Dockerfile 中其後的命令 RUN、CMD、ENTRYPOINT 都將使用該用戶。鏡像構建完成後,經過 docker run 運行容器時,能夠經過 -u 參數來覆蓋所指定的用戶。

10.CMD

CMD用於指定在容器啓動時所要執行的命令。CMD 有如下三種格式:

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

 

省略可執行文件的 exec 格式,這種寫法使 CMD 中的參數當作 ENTRYPOINT 的默認參數,此時 ENTRYPOINT 也應該是 exec 格式

11.ENTRYPOINT

ENTRYPOINT 用於給容器配置一個可執行程序。也就是說,每次使用鏡像建立容器時,經過 ENTRYPOINT 指定的程序都會被設置爲默認程序。

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

 

ENTRYPOINT 與 CMD 很是相似,不一樣的是經過docker run執行的命令不會覆蓋 ENTRYPOINT,而docker run命令中指定的任何參數,都會被當作參數再次傳遞給 ENTRYPOINT。Dockerfile 中只容許有一個 ENTRYPOINT 命令,多指定時會覆蓋前面的設置,而只執行最後的 ENTRYPOINT 指令。

FROM ubuntu:16.04
MAINTAINER 何民三 "cn.liuht@gmail.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hello World, 我是個容器' \ 
   > /var/www/html/index.html
ENTRYPOINT ["/usr/sbin/nginx"]
EXPOSE 80



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

 

在運行容器時,咱們使用了 -g "daemon off;",這個參數將會被傳遞給 ENTRYPOINT,最終在容器中執行的命令爲 /usr/sbin/nginx -g "daemon off;"

12.LABEL

LABEL用於爲鏡像添加元數據,一條LABEL指定能夠指定一或多條元數據,指定多條元數據時不一樣元數據之間經過空格分隔。

推薦將全部的元數據經過一條LABEL指令指定,以避免生成過多的中間鏡像。

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

 

13.ARG

ARG用於指定傳遞給構建運行時的變量

ARG site
ARG build_user=IT筆錄

 

以上咱們指定了 site 和 build_user 兩個變量,其中 build_user 指定了默認值。在使用 docker build 構建鏡像時,能夠經過 --build-arg <varname>=<value> 參數來指定或重設置這些變量的值

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

 

構建了 itbilu/test 鏡像,其中site會被設置爲 itbilu.com,因爲沒有指定 build_user,其值將是默認值 IT 筆錄。

14.ONBUILD設置鏡像觸發器

當所構建的鏡像被用作其它鏡像的基礎鏡像,該鏡像中的觸發器將會被鑰觸發。

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

 

15.STOPSIGNAL

STOPSIGNAL用於設置中止容器所要發送的系統調用信號,

STOPSIGNAL signal

所使用的信號必須是內核系統調用表中的合法的值,如:SIGKILL。

16.SHELL

SHELL用於設置執行命令(shell式)所使用的的默認 shell 類型:

FROM microsoft/windowsservercore

# Executed as cmd /S /C echo default
RUN echo default

# Executed as cmd /S /C powershell -command Write-Host default
RUN powershell -command Write-Host default

# Executed as powershell -command Write-Host hello
SHELL ["powershell", "-command"]
RUN Write-Host hello

# Executed as cmd /S /C echo hello
SHELL ["cmd", "/S"", "/C"]
RUN echo hello

 

示例

# 指定基礎鏡像
FROM sameersbn/ubuntu:14.04.20161014

# 維護者信息
MAINTAINER sameer@damagehead.com

# 設置環境
ENV RTMP_VERSION=1.1.10 \
    NPS_VERSION=1.11.33.4 \
    LIBAV_VERSION=11.8 \
    NGINX_VERSION=1.10.1 \
    NGINX_USER=www-data \
    NGINX_SITECONF_DIR=/etc/nginx/sites-enabled \
    NGINX_LOG_DIR=/var/log/nginx \
    NGINX_TEMP_DIR=/var/lib/nginx \
    NGINX_SETUP_DIR=/var/cache/nginx

# 設置構建時變量,鏡像創建完成後就失效
ARG BUILD_LIBAV=false
ARG WITH_DEBUG=false
ARG WITH_PAGESPEED=true
ARG WITH_RTMP=true

# 複製本地文件到容器目錄中
COPY setup/ ${NGINX_SETUP_DIR}/
RUN bash ${NGINX_SETUP_DIR}/install.sh

# 複製本地配置文件到容器目錄中
COPY nginx.conf /etc/nginx/nginx.conf
COPY entrypoint.sh /sbin/entrypoint.sh

# 運行指令
RUN chmod 755 /sbin/entrypoint.sh

# 容許指定的端口
EXPOSE 80/tcp 443/tcp 1935/tcp

# 指定網站目錄掛載點
VOLUME ["${NGINX_SITECONF_DIR}"]

ENTRYPOINT ["/sbin/entrypoint.sh"]
CMD ["/usr/sbin/nginx"]

 

TIPS

  • 容器輕量化。從鏡像中產生的容器應該儘可能輕量化,能在足夠短的時間內中止、銷燬、從新生成並替換原來的容器。
  • 使用 .gitignore。在大部分狀況下,Dockerfile 會和構建所需的文件放在同一個目錄中,爲了提升構建的性能,應該使用 .gitignore 來過濾掉不須要的文件和目錄。
  • 爲了減小鏡像的大小,減小依賴,僅安裝須要的軟件包。
  • 一個容器只作一件事。解耦複雜的應用,分紅多個容器,而不是全部東西都放在一個容器內運行。如一個 Python Web 應用,可能須要 Server、DB、Cache、MQ、Log 等幾個容器。一個更加極端的說法:One process per container。
  • 減小鏡像的圖層。不要多個 Label、ENV 等標籤。
  • 對續行的參數按照字母表排序,特別是使用apt-get install -y安裝包的時候。
  • 使用構建緩存。若是不想使用緩存,能夠在構建的時候使用參數--no-cache=true來強制從新生成中間鏡像。
相關文章
相關標籤/搜索