Dockerfile中常见的指令

FROM:指定创建镜像的基础镜像

  1. FROM <image>[:<tag>][as <name>]
  2. FROM <image>[:<digest>][as <name>]

MAINTAINER:Dockerfile作者信息,一般写的是联系方式
RUN:在当前镜像基础上执行的命令并提交为新镜像,后续的RUN都是在之前RUN提交后的镜像为基础

  1. 格式一:shell
  2. RUN <command> #将在shell终端运行,即/bin/sh -c
  3. 格式二: 使用exec 执行
  4. RUN ["executable", "param1", "param2"]
  5. 格式三:
  6. RUN ["sh","-c","echo hello"]
  7. 注意:
  8. 1.每条RUN指令将在当前镜像基础上执行,并提交为新的镜像,可以使用 \ 换行
  9. 2.exec形式将会作为json数组来解析,需要"" 而不能使用''
  10. 3.shell形式,或者execshell形式环境变量都会起作用
  11. 4.RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
  12. 可以在构建时指定--no-cache参数,如:docker build --no-cache

CMD:指定容器启动执行的命令;启动容器中的服务时执行,只能在dockerfile中使用一次,如果有多个只有最后一个生效,其余的均被覆盖。

  1. 格式一:
  2. CMD ["executable", "param1", "param2"](可执行文件优先)
  3. 格式二:
  4. CMD "param1","param2"
  5. 格式三:
  6. CMD command param1 param2
  7. 示例:
  8. CMD echo "this is a test" |wc -m (统计字符数)

CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了
LABEL:指定生成镜像的源数据标签

  1. 格式一
  2. LABEL <key>=<value>
  3. 示例:
  4. LABEL version="1.0" description="示例一" by="记录"

EXPOSE:指定镜像容器监听端口号

  1. EXPOSE <port> [<port>]

ENV:指定一次环境变量,可以被后续的RUN指令使用

  1. 格式一:
  2. ENV <key> <value> #只能设置一个变量
  3. 格式二:
  4. ENV <key>=<value> #可以设置多个变量
  5. 示例一:
  6. ENV myName linn
  7. 示例二:
  8. ENV name="linn" age=12

ARG:与ENV作用基本一致,区别在于构建的过程中使用,不会保留到容器中。

  1. 示例一
  2. ARG JAR_FILE=build/libs/*.jar

ADD:将数据移动到指定的目录;对压缩文件进行解压缩;可以访问网络资源

  1. 格式:
  2. ADD <src>...<dest>
  3. ADD ["<src>",..."<dest>"] 用于支持包含空格的路径
  4. 示例:
  5. ADD home* /mydir/ 添加全部的hom开头文件到/mydir 目录
  6. 路径必须是绝对路径,如果不存在会自动创建
  7. 路径必须要是dockerfile所在路径的相对路径
  8. 如果是一个目录,只会复制目录下的内容,而不会复制目录本身

COPY:复制宿主机数据到镜像内部使用,与ADD类似,但是不会自动解压,不能访问网络资源。

  1. COPY <src>...<desc>

WORKDIR:切换容器中的当前路径,在workdir中需要使用绝对路径,如果镜像中路径不存在,则会自动创建此目录。使用workdir来替代RUN cd 这一类切换目录的操作指令

  1. # 如下操作会将宿主机的test.txt 文件复制到 镜像的/tmp/test.txt。
  2. WORKDIR /tmp
  3. COPY test.txt .

VOLUME:挂载数据卷到镜像容器中
USER:指定运行容器的用户

  1. USER daemon

ONBUILD:用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
ENTRYPOINT:指定运行容器启动过程执行命令,并且不可被docker run 参数覆盖,而覆盖CMD参数,如果需要覆盖可以使用 docker run —entrypoint

  1. 格式一:
  2. ENTRYPOINT "executable""param1", "param2"
  3. 格式二:
  4. ENTRYPOINT command param1 param2
  5. 示例:
  6. ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "foregound"]

示例:基于springboot2.3

  1. FROM openjdk:11 as builder
  2. WORKDIR application
  3. ARG JAR_FILE=build/libs/*.jar
  4. COPY ${JAR_FILE} application.jar
  5. RUN java -Djarmode=layertools -jar application.jar extract
  6. FROM openjdk:11
  7. WORKDIR application
  8. ENV JAVA_OPT "-Xms500m -Xmx500m -Duser.timezone=Asia/Shanghai -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8"
  9. ENV SPRINGBOOT_OPT "--spring.profiles.active=dev --logging.config=/app/config/logback-spring.xml"
  10. ENV PROPERTIES_FILE "/app/config/application.properties"
  11. ENV LOG_PATH "/app/log/"
  12. COPY --from=builder application/dependencies/ ./
  13. COPY --from=builder application/spring-boot-loader/ ./
  14. COPY --from=builder application/snapshot-dependencies/ ./
  15. COPY --from=builder application/application/ ./
  16. ENTRYPOINT ["sh", "-c", "java ${JAVA_OPT} org.springframework.boot.loader.JarLauncher ${SPRINGBOOT_OPT}"]