詳解Dockerfile基本語法

安全劍客發表於2020-06-21
Dockerfile 是一個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明。

詳解Dockerfile基本語法詳解Dockerfile基本語法

Dockerfile的組成
Dockerfile分為四部分

基礎映象資訊

維護者資訊

映象操作指令

容器啟動時執行指令

Dockerfile指令說明
FROM
格式為FROM <image>或者FROM <image>:<tag>

第一條指令必須為FROM指令。並且,如果在同一個Dockerfile中建立多個映象時,可以使用多個FROM指令(每個映象一次)

示例:

FROM centos:6.6
MAINTAINER
格式為MAINTAINER ,指定維護者資訊

示例:

MAINTAINER Breeze Yan<yan_ruo_gu@163.com>
RUN
格式為RUN或者RUN ["executable","param1","param2"]

前者將在 終端中執行 ,即/bin/sh -c;後者使用exec執行。每條RUN指令將在當前映象基礎上執行指定 ,並提交為新的映象。當命令較長時,可以使用\來換行。
示例:

RUN ["/bin/bash", "-c","echo hello"]
CMD
支援三種格式:
CMD ["executable","param1","param2"] #使用exec執行,推薦的方式
CMD command param1 param2 #在/bin/sh中執行,提供給需要互動的應用
CMD ["param1","param2"] #提供給ENTRYPOINT的預設引數

指定啟動視窗時執行的命令,每個Dockerfile只能有一條CMD命令。如果指定了多條,只有最後一條會被執行。如果使用者啟動容器時指定了執行的命令,則會覆蓋掉CMD指定的命令

示例:

CMD ["supervisord","-c","/etc/supervisord.conf"]
EXPOSE
格式為EXPOSE [...]

告訴docker容器暴露的埠,供互聯絡統使用。在啟動容器時需要透過-P,docker主機會自動分配 一個埠轉發到指定的埠,使用-p,則可以具體指定哪個本地埠對映過來。

示例:

EXPOSE 22 80
ENV
格式為ENV

指定一個環境變數,會被後續RUN指令使用,並在容器執行時保持

示例:

ENV TZ "Asia/Shanghai"
ENV TERM xterm
ADD
格式為ADD

該命令將複製指定的到容器中的。其中可以是dockerfile所在目錄的一個相對路徑(檔案或目錄),也可以是一個URL,還可以是一個tar檔案(自動解壓為目錄)

示例:

ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo
COPY
格式為COPY

與ADD類似,複製本地主機的為容器中的,目標路徑不存在時,會自動建立。當使用本地目錄為源目錄時,推薦使用COPY

ENTRYPOINT
格式:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2 (shell中執行)

與CMD類似,配置容器啟動後執行的命令,但不會被docker run 提供的引數覆蓋。每個dockerfile只能有一個ENTRYPOINT,如果指定了多個,只有最後一個被執行

VOLUME
格式為VOLUME ["/data"]

建立一個掛載點,類似於容器啟動時使用的-v選項,只不過這裡不能指定掛載到宿主機的位置。預設為/var/lib/docker/vfs目錄下。一般用來存放資料庫和需要保持的資料。

USER
格式為 USER daemon

指定執行容器時的使用者名稱或UID,後續的RUN也會使用指定使用者。當服務不需要管理員許可權時,可以透過該命令指定執行使用者。並且可以在之前建立所需要的使用者。要臨時獲取管理員許可權時可以使用gosu。

WORKDIR
格式為WORKDIR /path/to/workdir

為後續的RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑。

示例:

# 最終路徑為/a/b/c
WORKDIR /a
WORKDIR b
WORKDIR c
ONBUILD
格式為ONBUILD [INSTRUTION]

配置當所建立的映象作為其它新建立映象的基礎映象時,所執行的操作指令。

例如dockerfile使用如下內容建立了映象A:

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

如果基於映象A建立新的映象時,新的dockerfile使用FROM A指定基礎映象時,會自動執行ONBUILD指令內容,等價於在後面新增了兩條指令。

FROM A
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的映象,推薦在標籤中註明,如:ruby:1.9-onbuild

使用Dockerfile生成映象

#mysoft/centos:6.6為新生成的映象的標籤,/tmp/dockerfile/centos6為dockerfile所在路徑。

docker build -t mysoft/centos:6.6 /tmp/dockerfile/centos6

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2699680/,如需轉載,請註明出處,否則將追究法律責任。