我的docker隨筆11:Dockerfile編寫

本文介紹Dockerfile相關的知識。

一、概述

Dockerfile是構建docker鏡像的文件,該文件描述瞭如何構建docker鏡像。有其的語法和使用方式,註釋使用“#”。
在實際使用中,可以基於官方或其它鏡像,再進行創建。
Dockerfile分爲四個部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動時執行指令。
例如:

#這裏說明基礎鏡像信息
#......
FROM ubuntu

#這裏說明維護者信息
#......
MAINTAINER DOCKER_USER

#這裏說明鏡像操作指令
#.......
RUN apt-get update

#這裏說明容器啓動時執行指令
CMD /bin/bash

大部分Dockerfile都有這幾部分組成。Dockerfile學習起來不容易,但也不困難,在瞭解基本概念後,最好的方法是閱讀官方的Dockerfile文件。列舉幾個如下:

busybox:https://github.com/docker-library/busybox/blob/4b11c30f87d3033b2abd446c9bc1ef12f96abaa0/uclibc/Dockerfile (僅三行,可從此入手實踐)
redis:https://github.com/docker-library/redis/blob/ede954da6de61f1d6a8572db4cd7bdf1278a2815/5.0/Dockerfile
mysql:https://github.com/docker-library/mysql/blob/ed0e47e48b8ca3dbc4d68d68f56384bdd1fb5cdb/5.6/Dockerfile

筆者也積累了一些,有興趣可以參考:https://github.com/latelee/dockerfile

二、指令說明

指令的一般格式爲<指令> <參數>,指令包括FROM、MAITNTAINER、RUN等,簡列如下:

FROM	指定所創建鏡像的基礎鏡像
MAINTAINER	指定維護者信息
RUN	運行命令
CMD	指定啓動容器時默認執行的命令
LABEL	指定生成鏡像的元數據標籤信息
EXPOSE	聲明鏡像內服務所監聽的端口
ENV	指定環境變量
ADD	複製指定的路徑下的內容到容器下
COPY	複製本地主機的路徑下的內容到鏡像中
ENTRYPOINT	指定鏡像的默認入口
VOLUME	創建數據卷掛載點
USER	指定運行容器時的用戶名或UID
WORKDIR	配置工作目錄
ARG	指定鏡像內使用的參數(如版本號信息等)
ONBUILD	配置當前所創建的鏡像作爲其他鏡像的基礎鏡像時,所執行的創建操作指令
STOPSIGNAL	容器退出的信號值
HEALTHCHECK	如何進行健康檢查
SHELL	指定使用shell時的默認shell類型

下面分別進行介紹。

FROM

功能爲指定基礎鏡像,並且必須是第一條指令。如果本地鏡像不存在或者鏡像倉庫中不存在,則回去DockerHub下載指定鏡像。 如果在同一個Dockerfile中創建多個鏡像,可以使用多個FROM指令(每個鏡像一次)。
語法:

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

三種寫法,其中和 是可選項,如果沒有選擇,那麼默認值爲latest。

RUN

功能爲運行指定的命令。
語法:

RUN <command>
RUN ["executable", "param1", "param2"]

第一種後邊直接跟shell命令,在linux操作系統上默認爲/bin/sh –c
第二種是類似於函數調用。可將executable理解成爲可執行文件,後面就是兩個參數。
示例:

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]

注意:多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層。
多少個RUN就構建了多少層鏡像,會造成鏡像的臃腫、多層,不僅僅增加了構件部署的時間,還容易出錯。

RUN命令較長書寫較長時可以使用換行符\。示例:

RUN apt-get update \
     && apt-get install vim

CMD

功能爲容器啓動時要運行的命令。
語法:

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

每個Dockerfile只能有一條CMD命令。如果指定了多條命令,只有最後一條會被執行。用戶在啓動容器時手動指定了運行的命令,則會覆蓋CMD指定的命令。
示例:

CMD [ "sh", "-c", "echo $HOME" 
CMD [ "echo", "$HOME" ]

補充細節:這裏邊包括參數的一定要用雙引號,就是",不能是單引號。千萬不能寫成單引號。

LABEL

功能是爲鏡像指定生成鏡像的元數據標籤信息。
語法:

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

示例:

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

說明:LABEL會繼承基礎鏡像種的LABEL,如遇到key相同,則值覆蓋。

MAINTAINER

功能指定作者
語法:

MAINTAINER <name>

示例:

MAINTAINER  "[email protected]"

該信息會寫入生成鏡像的Author屬性域中。

EXPOSE

功能爲暴漏容器運行時的監聽端口給外部。
語法:

EXPOSE <PORT> [<PORT>…]

示例:

EXPOSE 22 80 443

注意,該指令只是起到聲明作用,並不會自動完成端口映射,需要在啓動容器時加-p。

ENV

功能爲設置環境變量
語法:

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

示例:

ENV PATH /usr/local/bin:$PATH

ADD

功能把文件複製到鏡像中。
如果把虛擬機與容器想象成兩臺linux服務器的話,那麼這個命令就類似於scp,只是scp需要加用戶名和密碼的權限驗證,而ADD不用。
語法:

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

<dest>路徑的填寫可以是容器內的絕對路徑,也可以是相對於工作目錄的相對路徑
<src>可以是一個本地文件或者是一個本地壓縮文件,還可以是一個url
如果把<src>寫成一個url,那麼ADD就類似於wget命令

示例:

ADD test relativeDir/ 
ADD test /relativeDir
ADD http://example.com/foobar /

儘量不要把<scr>寫成一個文件夾,如果<src>是一個文件夾了,複製整個目錄的內容,包括文件系統元數據

COPY

功能把文件複製到鏡像中。
語法:

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

與ADD的區別,COPY的<src>只能是本地文件,其他用法一致

ENTRYPOINT

功能是啓動時的默認入口命令。該入口命令會在啓動容器時作爲根命令執行,所有傳入值作爲該命令的參數。
語法:

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

只能寫一條,如果寫了多條,那麼只有最後一條生效。

VOLUME

功能可以將文件夾或者其他容器中的文件夾掛在到這個容器中。
語法:

VOLUME ["/data"]

說明:
["/data"]可以是一個JsonArray ,也可以是多個值。
例如:

VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db

一般的使用場景爲需要持久化存儲數據時,當數據需要持久化時用這個命令。

USER

功能設置啓動容器的用戶,可以是用戶名或UID。
語法:

USER daemo
USER UID

注意:如果設置了容器以daemon用戶去運行,那麼RUN、CMD和ENTRYPOINT都會以這個用戶去運行

WORKDIR

功能爲後續的RUN、CMD、ENTRYPOINT指令配置工作目錄。
語法:

WORKDIR /path/to/workdir

如果不存在則會創建,也可以設置多次。
示例:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

pwd執行的結果是/a/b/c

WORKDIR也可以解析環境變量。
示例:

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

pwd的執行結果是/path/$DIRNAME

ARG

功能指定鏡像內使用的參數(版本號信息等)。
語法:

ARG <name>[=<default value>]

設置變量命令,ARG命令定義了一個變量,在docker build創建鏡像的時候,使用 --build-arg <varname>=<value>來指定參數。
示例:

FROM busybox
ARG user1
ARG buildno=1

三、創建鏡像

編寫完成Dockerfile之後,可以通過docker build命令來創建鏡像。
語法:

docker build [OPTIONS] PATH | URL | -

示例:

#docker build –t ubuntu:v1 .

注意:命令後面的點號表示當前路徑,默認文件名稱爲Dockerfile,如果不是這個名稱,需要手動指定,但一般都用默認的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章