dockerfile

Best practices for writing Dockerfiles

Dockerfile 文件说明

  1. 每一行以Dockerfile的指令开头,指令不区分大小写,惯例使用大写
  2. 使用 # 开始作为注释
  3. 每一行只支持一条指令,每条指令可以携带多个参数
  4. 指令按文件的顺序从上至下进行执行
  5. 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
  6. 制作镜像一般可能需要反复多次,每次执行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

image

[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
原文地址:https://www.cnblogs.com/firewalld/p/14633434.html