目录
Best practices for writing Dockerfiles
Dockerfile 文件说明
- 每一行以Dockerfile的指令开头,指令不区分大小写,惯例使用大写
- 使用 # 开始作为注释
- 每一行只支持一条指令,每条指令可以携带多个参数
- 指令按文件的顺序从上至下进行执行
- 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
- 制作镜像一般可能需要反复多次,每次执行dockfile都按顺序执行,从头开始,已经执行过的指令已经缓存,不需要再执行,如果后续有一行新的指令没执行过,其往后的指令将会重新执行,所以为加速镜像制作,将最常变化的内容放下dockerfile的文件的后面
FROM | 指定基础镜像 |
---|---|
LABEL | 指定镜像元数据 |
ADD | 复制和解包文件 |
COPY | 复制本地宿主机的文件到容器中(use add) |
ENV | 设置环境变量, 可让后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持 |
ARG | 构建参数,ARG指令在build 阶段指定变量,和ENV不同的是,容器运行时不会存在这些环境变量. 如果和ENV同名,ENV覆盖ARG变量 |
EXPOSE | 暴露端口, 指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信 |
ENTRYPOINT | 入口点,功能类似于CMD,配置容器启动后执行的命令及参数 |
RUN | 执行shell命令,在构建镜像阶段需要执行 FROM 指定镜像所支持的Shell命令 |
USER | 指定当前用户,指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。如果没有指定 USER,默认是 root 身份执行 |
VOLUME | 匿名卷, 即使容器后期被删除,此宿主机的目录仍会保留,实现容器数据的持久保存 /var/lib/docker/volumes/<volume_id>/_data |
WORKDIR | 指定工作目录, 为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录,WORKDIR 会自行创建 |
CMD | 容器启动命令 |
HEALTHCHECK | 检查容器的健康性 |
STOPSIGNAL | 退出容器的信号 |
SHELL | 指定shell |
[0 root@vps /data/dockerfile] #cat Dockerfile
FROM nginx-ubuntu:1.18
LABEL maintainer="AlexG firewalld@foxmail.com"
user="nginx"
RUN echo `hostname -i`Nginx Website in Docker > /usr/local/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
[0 root@vps /data/dockerfile] #cat build.sh
docker build /data/dockerfile/ -t $1
[0 root@vps /data/dockerfile] #bash build.sh nginx:v1
Sending build context to Docker daemon 3.072kB
Step 1/5 : FROM nginx-ubuntu:1.18
---> b43e05778727
Step 2/5 : LABEL maintainer="AlexG firewalld@foxmail.com" user="nginx"
---> Running in e04f374c228d
Removing intermediate container e04f374c228d
---> b12e6d0236f3
Step 3/5 : RUN echo `hostname -i`Nginx Website in Docker > /usr/local/nginx/html/index.html
---> Running in d343d7511455
Removing intermediate container d343d7511455
---> cba247a9f7e5
Step 4/5 : EXPOSE 80
---> Running in b060542ed701
Removing intermediate container b060542ed701
---> a063cc75db02
Step 5/5 : CMD ["nginx", "-g", "daemon off;"]
---> Running in 880b8b0be52c
Removing intermediate container 880b8b0be52c
---> a5baca5fad04
Successfully built a5baca5fad04
Successfully tagged nginx:v1
[0 root@vps /data/dockerfile] #
Dockerfile workflow
1. 选择一个基础镜像的容器
FROM ubuntu:18.04
2. 做相关自定义设置
ADD sources .
ADD code.tgz .
RUN cd /apps &&
mvn clean install
CMD ["mvn", "spring-boot:run"]
3. 导出或打为镜像标签上传仓库
docker commit -m="add sources" -a="AlexG" ${容器ID/NAME} front_web:v1.0
docket tag front_web:v1.0 docker.registary.com/dev/front_web:v1.0
docker save front_web:v1.0 > /data/front_web_1.0.tgz
docker load -i /data/front_web_1.0.tgz
4. 运行测试
docker run -d -P docker.registary.com/dev/front_web:v1.0
nginx.dockerfile
FROM centos:7.9.2009
LABEL nginx.version=1.18.0
LABEL maintainer="AlexG <firewalld@foxmmail.com>"
WORKDIR /data
ADD nginx-1.18.0.tar.gz /data
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel make
&& useradd -M -s /sbin/nologin nginx
&& cd nginx-1.18.0
&& ./configure --prefix=/usr/local/nginx
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_v2_module
--with-http_realip_module
--with-http_stub_status_module
--with-http_gzip_static_module
--with-pcre
--with-stream
--with-stream_ssl_module
--with-stream_realip_module
&& make && make install
&& rm -rf /data/nginx-1.18.0
&& chown -R nginx.nginx /usr/local/nginx
&& chown -R nginx.nginx /usr/local/nginx
&& ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
&& echo "<h1>Nginx is OK</h1>" > /usr/local/nginx/html/index.html
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
docker build -f Dockerfile -t nginx:v1
docker run --name local-nginx -d -p 80:80 nginx:v1
- PS
/usr/share/vim/vimfiles/doc/dockerfile.txt
/usr/share/vim/vimfiles/ftdetect/dockerfile.vim
/usr/share/vim/vimfiles/syntax/dockerfile.vim