每天进步一点点 - DockerFile的编写

106 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

1、序言

项目使用的是Docker快速部署应用,之前对于DockerFile的了解知之甚少,所以借这个项目的机会,来学习一下Docker及其相关操作,本文主要是DockerFile的相关知识。

2、DockerFile是什么?

DockerFile是一个文本文件,主要是用来构建Docker镜像的,其内容主要包含了构建镜像所需的指令和说明。

3、执行顺序

在使用命令docker build运行DockerFile的时候,Docker会以从上到下的顺序逐行读取DockerFile,识别其中每行命令,来构建对应的Docker容器。

4、官方文档指令

4.0 指令列表

  • 这些命令是从官方文档中查找的,当前时间:2022-04-06 19:22:37
命令说明官方说明
FROM指定当前镜像所用基础镜像FROM
RUN指定编译过程中要运行的命令RUN
CMD启动容器时可以执行的命令CMD
LABEL设置镜像的标签LABEL
MAINTAINER设置当前镜像的作者(官方标识已过期)MAINTAINER
EXPOSE声明当前镜像需要暴露的接口EXPOSE
ENV指定当前容器的环境变量ENV
ADD复制镜像外部资源到镜像内ADD
COPY从构建的上下文中复制文件COPY
ENTRYPOINT设置一下当前容器的入口程序和参数ENTRYPOINT
VOLUME设置当前的挂载VOLUME
USER设置运行程序的用户名USER
WORKDIR指定容器的工作目录WORKDIR
ARG编译镜像时的额外参数ARG
ONBUILD设置当前容器的命令ONBUILD
STOPSIGNAL设置容器推出时的信号量STOPSIGNAL
HEALTHCHECK容器的健康检查HEALTHCHECK
SHELL执行的shell脚本SHELL

为了指定基本映像,第一条指令必须是FROM

4.1 FROM

  • 功能:指定当前镜像所用基础镜像,因此Dockerfile第一条非注释指令必须是FROM。
格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
注:
    tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

4.2 RUN

  • 功能:指定编译过程中要运行的命令,其有以下两种命令执行方式。
shell执行
格式:
    RUN <command>
exec执行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN ["/etc/execfile", "arg1", "arg1"]
注: 
    RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。
    如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

说明:CMD 在docker run 时运行;RUN 在docker build 时运行。

4.3 CMD

  • 功能:提供容器运行时的默认值,这些默认值可以是一条指令,也可以是一些参数;一个Dockerfile中可以有多条CMD指令,但只有最后一条CMD指令有效。
格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:   
    CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

4.4 LABEL

4.5 EXPOSE

4.6 ENV

4.7 COPY

4.8 ENTRYPOINT

4.9 ARG

5、项目DockerFile

#指定基础镜像
FROM java:8

#这里的 /tmp 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层
VOLUME /tmp

#复制上下文目录下的target/xxxx.jar 到容器里
COPY target/xxxx.jar xxxx.jar

#RUN新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像。
RUN bash -c "touch /xxxx.jar"

#声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 9200

#指定容器启动程序及参数 
ENTRYPOINT ["java","-jar","xxxx.jar"]