Dockerfile簡介
Dockerfile是Docker中用來自動化構建映象的配置檔案,在Dockerfile中,包含了構建映象過程中需要執行的命令、引數以及其他操作,並且支援以#
開頭的註釋行。
Dockerfile結構大致分為四部分:
- 基礎映象資訊
- 維護者資訊
- 映象操作指令
- 映象啟動時執行的命令
DockerFile構建過程
- docker從基礎映象執行一個容器
- 執行一條指令並對容器做修改
- 執行類似docker commit的操作提交一個新的映象層
- docker再基於剛提交的映象執行一個新的容器
- 執行dockerfile中的下一條指令直到所有指令都執行完成
Dockerfile構建過程是以基礎映象為基礎的,每一條指令構建一層映象,因此每一條指令的內容,就是描述該層應當如何構建。以此,有了Dockerfile,我們可以方便的定製自己額外的需求,只需在Dockerfile裡新增或者修改指令,重新構建即可。
Dockerfile常用指令
FROM
FROM 指令用於指定指定基礎映象,其後構建新映象以此為基礎進行構建。FROM
指令是Dockerfile檔案中除註釋命令之外的第一條指令,也是必備的指令。如果在同一個Dockerfile中建立多個映象時,可以使用多個FROM
指令(每個映象一次)。
格式
FROM <image>
# 或
FROM <image>:<tag>
# 或
FROM <image>:<digest>
tag或digest是可選引數,如果不使用這兩個值時,會使用latest版本的基礎映象。
例如,指定ubuntu的14.04版本作為基礎映象:
FROM ubuntu:14.04
MAINTAINET
格式MAINTAINET
指定維護者的資訊。
RUN
在映象的構建過程中執行特定的命令(執行某些動作、安裝系統軟體、配置系統資訊之類),並生成一箇中間映象。
格式
# shell格式
RUN <命令>
# exec格式
RUN ["可執行檔案", "引數1", "引數2"]
注意:如果有多行命令儘量不要寫多個RUN
,因為Dockerfile中每一個指令都會構建一層,多少個RUN
就構建了多少層映象,會造成映象的臃腫,還增加了構件部署的時間,可以使用換行符\
。
COPY
COPY
命令用於將宿主機器上的的檔案(Dockerfile所在目錄的相對路徑)複製到映象內,如果目的位置不存在,Docker會自動建立。
格式
COPY <源路徑>...<目標路徑>
COPY ["<源路徑1>",..."<目標路徑>"]
例如,把宿主機中的test.json檔案複製到容器中/usr/src/app/目錄下:
COPY test.json /usr/src/app/
ADD
ADD
指令的作用和COPY
基本一致,但是在COPY
基礎上增加了一些功能,源路徑可以是URL,也可以是 tar.gz。語法格式也和COPY
一致。
ENV
設定環境變數
格式
ENV <key> <value>
# 或
ENV <key1>=<value1> <key2>=<value2>...
例如:
ENV name=tigeriaf version=1.1.1
EXPOSE
為構建的映象設定監聽埠,使容器在執行時監聽。
格式
EXPOSE <port1> [<port2>...]
例如:
EXPOSE 8080
EXPOSE 8080
其實等價於docker run -p 8080
,如果需要把8081埠對映到宿主機中的某個埠(如8088)以便外界訪問時,則可以用docker run -p 8088:8080
WORKDIR
WORKDIR用於在容器內指定工作目錄:
WORKDIR /test/
通過WORKDIR設定工作目錄後,Dockerfile中其後的命令RUN
、CMD
、ENTRYPOINT
等命令都會在該目錄下執行。
USER
USER
用於指定執行映象所使用的使用者。
格式
USER root
使用USER
指定使用者後,Dockerfile中其後的命令RUN
、CMD
、ENTRYPOINT
都將使用該使用者執行。
CMD
格式
CMD ["可執行檔案", "引數1", "引數2"]
指定啟動容器時執行的命令,每個Dockerfile只能有一條CMD
指令,如果指定了多條指令,則最後一條生效。
其作用是在啟動容器的時候提供一個預設的命令項,如果使用者執行docker run
時提供了命令項,這個命令就會覆蓋掉。
VOLUME
格式
VOLUME ["/data"]
建立一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的資料等。
ENTRYPOINT
容器啟動後執行的命令,這些命令不能被docker run
提供的引數覆蓋。和CMD
一樣,每個Dockerfile中只能有一個ENTRYPOINT
,如果指定了多條指令,則最後一條生效。 格式
ENTRYPOINT ["可執行檔案", "引數1", "引數2"]
ONBUILD
ONBUILD
用於配置當前所建立的映象作為其它新建立映象的基礎映象時,所執行的操作指令。 格式
ONBUILD [INSTRUCTION]
DockerFile例項
編寫Dockerfile
構建MySQL映象
FROM ubuntu:bionic-20190612
LABEL maintainer xxxx@xxxx.com
ENV MYSQL_USER=mysql
MYSQL_VERSION=5.7
MYSQL_DATA_DIR=/var/lib/mysql
MYSQL_RUN_DIR=/run/mysqld
MYSQL_LOG_DIR=/var/log/mysql
RUN apt-get update
&& DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server=${MYSQL_VERSION}*
&& rm -rf ${MYSQL_DATA_DIR}
&& rm -rf /var/lib/apt/lists/*
EXPOSE 3306/tcp
CMD ["/usr/bin/mysqld_safe"]
執行構建命令構建
docker build
命令用於使用Dockerfile建立映象。
格式
docker build [OPTIONS] PATH | URL | -
常用OPTION如下::
- –build-arg=[]:設定映象建立時的變數
- -f:指定要使用的Dockerfile路徑
- -m:設定記憶體最大值
- –force-rm:設定映象過程中刪除中間容器
- –rm:設定映象成功後刪除中間容器
- –tag, -t:映象的名字及標籤,通常 name:tag 或者 name 格式
本作品採用《CC 協議》,轉載必須註明作者和本文連結