Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
>[info]減少分層,縮小鏡像體積。
使用.dockerignore
## 構建鏡像
~~~
docker build [選項] <上下文路徑/URL/->
~~~
### 參數
~~~
-t,--tag
打標簽
~~~
## 構建上下文
構建時會將上下文的內容傳到docker的服務端,需要使用的文件也需要放到這個上下文中。
## FROM 指定存在的基礎鏡像
~~~
FROM <image> 或者
FROM <image>:<tag>
~~~
## MAINTAINER 指定作者和聯系信息
~~~
MAINTAINER <name>
比如:MAINTAINER hiyang echohiyang@foxmail.com
~~~
## RUN 鏡像構建過程中需要執行的指令
~~~
shell模式
RUN <command> 默認使用`/bin/sh -c `執行命令
RUN yum install -y httpd
exec模式
RUN ["executable", "param1", "param2"]
RUN ["/bin/bash", "-c", "echo hello"]
~~~
## CMD 指定容器運行時的默認行為
若運行時指定指令,則會被覆蓋
~~~
CMD ["executable", "param1", "param2"]
CMD command param1 param2
~~~
RUN和CMD看起來挺像,但是,CMD用來指定容器啟動時用到的命令,只能有一條。當docker run時指定運行命令,將不會執行
## ENTRYPOINT 格式類似CMD
容器啟動時要執行的命令,它和CMD很像,也是只有一條生效,如果寫多個只有最后一條有效。
CMD 是可以被 docker run 指令覆蓋的,而ENTRYPOINT的參數可以被--entrypoint覆蓋;會比CMD或者docker run指定的命令要靠前執行。
## EXPOSE
~~~
EXPOSE <port> [<port>...]
EXPOSE 22 80 8443
~~~
這個用來指定要映射出去的端口,比如容器內部我們啟動了sshd和nginx,所以我們需要把22和80端口映射出去。
## ENV
它主要是為后續的RUN指令提供一個環境變量;在構建過程和運行過程中同樣有效
~~~
ENV <key> <value>, 比如
ENV PATH /usr/local/mysql/bin:$PATH
ENV MYSQL_version 5.6
~~~
## COPY 復制
~~~
COPY <源路徑>... <目標路徑>
~~~
構建上下文目錄中 **<源路徑>** 的文件/目錄復制到新的一層的鏡像內的 <目標路徑> 位置 ,<目標路徑> 可以是容器內的絕對路徑,也可以是相對于工作目錄的相對路徑
>[danger]使用 COPY 指令,源文件的各種元數據都會保留。比如讀、寫、執行權限、文件變更時間等。這個特性對于鏡像定制很有用。特別是構建相關文件都在使用 Git 進行管理的時候。
## ADD 高級復制
~~~
ADD <src> <dest>
~~~
提供了tar功能
將本地的一個文件或目錄拷貝到容器的某個目錄里。 其中src為Dockerfile所在目錄的相對路徑,它也可以是一個url(不推薦使用)。
## VOLUME
~~~
VOLUME ["/data"]
~~~
創建一個可以從本地主機或其他容器掛載的掛載點。
## USER 默認使用root用戶
~~~
USER daemon
~~~
執行 RUN , CMD 以及ENTRYPOINT 這類命令的身份
## WORKDIR
~~~
WORKDIR /path/to/workdir
~~~
需使用絕對路徑
## ONBUILD
鏡像觸發器,當鏡像為用作其他鏡像的基礎鏡像時會執行
會在構建過程中插入指令
## HEALTHCHECK
選項
~~~
--interval=<間隔>
兩次健康檢查的間隔,默認為 30 秒;
--timeout=<時長>
健康檢查命令運行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,默認 30 秒;
--retries=<次數>
當連續失敗指定次數后,則將容器狀態視為unhealthy ,默認 3 次
~~~
### 測試用
~~~
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib
/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
~~~
## docker build -t centos:base -f /soft/docker/Dockerfile /soft
~~~
docker build -t myweb:v1 .
docker run -d --name web -p 80:80 myweb:v1
docker inspect --format '{{json .State.Health}}' web | python -m json.tool
~~~
[dockerfile最佳實踐][]
[1]:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/