筆記:使用Dockerfile構建映象

Luson發表於2021-10-21

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中其後的命令RUNCMDENTRYPOINT等命令都會在該目錄下執行。

USER

USER用於指定執行映象所使用的使用者。

格式

USER root

使用USER指定使用者後,Dockerfile中其後的命令RUNCMDENTRYPOINT都將使用該使用者執行。

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 協議》,轉載必須註明作者和本文連結

相關文章