0 什麼是 Dockerfile?
Dockerfile 是一個用來建構鏡像的文本檔案,文本内容包含了一條條建構鏡像所需的指令和說明。
1 FROM
定制的鏡像都是基于 FROM 的鏡像,後續的操作都是基于該 image。
-
FROM scratch
制作base image
-
FROM centos
使用base image
- FROM ubuntu:14.04
最佳實踐
考慮安全性,請盡量使用官方 image 作為 base image。
2 LABEL
1. LABEL maintainer= "[email protected]'
2. LABEL version="1.O"
3. LABEL description="This is a description"
這就像代碼的注釋,必須寫好中繼資料。
3 RUN
用于執行後面跟着的指令行指令。有以下倆種格式:
Shell格式
1. RUN apt-get install -y vim
2. CMD echo "hello docker"
3. ENTRYPOINT echo "hello docker"
Dockerfile

docker build -t javaedge/centos-shell 。
docker image ls
docker run javaedge/centos-shell
RUN <指令行指令>
# <指令行指令> 等同于,在終端操作的 shell 指令。
Exec 格式
RUN [ "apt-get" , "install" , "-y", "vim" ]
CMD [ " /bin/echo" , "hello docker" ]
ENTRYPOINT [ "/bin/echo" , "hello docker" ]
Dockerfile2
那如何修改才能讓 exec 格式的指令能被 shell 識别呢,修正:
RUN ["可執行檔案", "參數1", "參數2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等價于 RUN ./test.php dev offline
RUN yum update && yum install -y vim \
python-dev # 反斜線換行RUN apt-get update && apt-get install -y perl \
pwgen --no-install-recommends && rm -rf \
/var/lib/apt/lists/* # 注意清理cacheRUN /bin/bash -C 'source $HOME/.bashrc; echo
$HOME'
Dockerfile 的指令每執行一次都會在 docker 上建立一層。是以過多無意義的層,會造成鏡像膨脹過大。例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上執行會建立 3 層鏡像。可簡化為以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
如上,以 && 符号連接配接指令,這樣執行後,隻會建立 1 層鏡像。
-
可讀性
複雜RUN用反斜線換行
-
避免無用分層
合并多條指令成一行