Dockerfile書寫規則

簡介

Dockerfile相似於Makefile,包含有多條構建指令,Docker能夠經過Dockerfile自動生成自定義鏡像。docker

用法

docker build命令根據Dockerfile上下文構建鏡像。構建的上下文是指定位置PATH或URL的文件集合。PATH是本地文件系統的一個文件夾。URL是一個Git倉庫地址。shell

構建由Docker守護進程運行,而不是由CLI運行。構建過程所作的第一件事是將整個上下文遞歸地發送到守護進程。在大多數狀況下,最好以空目錄做爲上下文,並將Dockerfile保存在該目錄中,僅添加構建鏡像所需的文件。網絡

不要使用根目錄,/做爲構建的上下文PATH,這樣會致使將磁盤上全部的內容發送到守護進程。curl

在Dockerfile中經過指令指定上下文中的文件。若是要提升構建性能,能夠經過.dockerignore排除上下文中的某些文件或目錄。ide

格式

# Comment
INSTRUCTION arguments

指令不區分大小寫,可是慣例使用大寫,以便將它們和參數區分開來。工具

Docker按順序執行Dockerfile中的指令。一個Dockerfile必須用FROM指令啓動。性能

Docker使用#做爲註釋的開頭。ui

Dockerfile指令

FROM

指定基礎鏡像,一般咱們會基於某個基礎鏡像定製本身的鏡像,在DockerStore上有不少的官方鏡像,咱們能夠基於這些鏡像來定製本身的鏡像。若是沒有找到對應的鏡像,官方鏡像中還提供了一些更爲基礎的操做系統鏡像;除此以外,還存在一個名爲scratch的特殊鏡像,這個鏡像並不實際存在,是一個空白的鏡像。url

FROM <image> [AS <name>]

or操作系統

FROM <image>[:<tag>] [AS <name>]

or

FROM <image>[@<digest>] [AS <name>]

RUN

執行命令行命令。

RUN有兩種形式:

  • RUN <command> (shell格式,該命令在shell中運行,默認狀況下/bin/sh -c在Linux或cmd /S /C Windows上運行)
  • RUN ["executable", "param1", "param2"](exec格式)

CMD

指定容器主進程的啓動命令。在運行時能夠指定新的命令來代替這個默認命令。

CMD指令有三種格式:

  • CMD ["executable","param1","param2"] (exec格式,通常推薦使用的格式)
  • CMD ["param1","param2"] (參數列表格式)
  • CMD command param1 param2 (shell格式)

LABEL

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

LABEL指令添加元數據到鏡像中。若是要使用包含有空格的元數據,能夠給key-value加上引號。

MAINTAINER

MAINTAINER <name>

這個指令設置鏡像的維護者。而LABEL更加靈活,能夠設置任何須要的元數據,而且能夠輕鬆查看。要設置MAINTAINER信息可使用LABEL進行設置:

LABEL maintainer="SvenDowideit@home.org.au"

EXPOSE

EXPOSE <port> [<port>/<protocol>...]

EXPOSE指令告訴Docker容器在運行時監聽指定的網絡端口。若是未指定協議,則默認爲TCP。

EXPOSE指令僅僅是聲明運行時容器打算使用什麼端口,並不會自動在宿主進行端口映射。

ENV

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

ENV指令將環境變量<key>設置爲值<value>。這個值將在構建階段中的全部後續指令環境中。

COPY

複製文件。

COPY有兩種格式:

COPY <src>... <dest>
COPY ["<src>", ... "<dest>"]

ADD

更高級的複製文件

ADD指令和COPY基本一致,可是在COPY的基礎上加強了一些功能。好比源文件能夠是一個URL,在這種狀況下,Docker會試圖去下載這個連接的文件放到目標路徑中,下載後的文件權限自動設置爲600,若是這個權限不是想要的權限,那麼還須要增長額外的RUN進行權限調整,何況,若是下載的是壓縮包,還須要解壓縮。因此不如直接調用RUN指令,而後使用wget或者curl工具下載,這個功能並不推薦使用。

若是源文件是一個tar壓縮包的話,壓縮格式爲gzip,bzip2以及xz的狀況下,ADD指令將會自動解壓縮這個壓縮文件到目標路徑中,在某些狀況下這個自動解壓縮的功能很是有用。

ENTRYPOINT

入口點

ENTRYPOINT的格式和RUN指令格式同樣,分爲exec格式和shell格式。

ENTRYPOINT的目的和CMD同樣,都是指定了容器啓動的參數。ENTRYPOINT在運行時也能夠被替代,須要經過docker run的參數-entrypoint來指定。

若是指定了ENTRYPOINT指令,CMD就再也不是直接運行了,而是將CMD的內容做爲參數傳遞給ENTRYPOINT指令。

ARG

構建參數

ARG <name>[=<defaul value>]

構建參數和ENV的效果同樣,都是設置環境變量。不一樣的是,ARG所設置的構建環境的環境變量在未來容器運行時是不會存在的。

VOLUME

定義匿名卷

VOLUME ["/data"]

WORKDIR

指定工做目錄。

使用WORKDIR指令能夠指定工做目錄。

USER

指定當前用戶。

相關文章
相關標籤/搜索