0 什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
1 FROM
定制的镜像都是基于 FROM 的镜像,后续的操作都是基于该 image。
- FROM scratch
制作base image - FROM centos
使用base image - FROM ubuntu:14.04
最佳实践
考虑安全性,请尽量使用官方 image 作为 base image。
2 LABEL
LABEL maintainer= "javaedge@gmail.com' LABEL version="1.O" LABEL description="This is a description"
最佳实践
这就像代码的注释,必须写好元数据。
3 RUN
用于执行后面跟着的命令行命令。有以下俩种格式:
Shell格式
RUN apt-get install -y vim CMD echo "hello docker" 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/* # 注意清理cache RUN /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用反斜线换行 - 避免无用分层
合并多条命令成一行