Dockerfile中常见的指令
FROM:指定创建镜像的基础镜像
FROM <image>[:<tag>][as <name>]FROM <image>[:<digest>][as <name>]
MAINTAINER:Dockerfile作者信息,一般写的是联系方式
RUN:在当前镜像基础上执行的命令并提交为新镜像,后续的RUN都是在之前RUN提交后的镜像为基础
格式一:shellRUN <command> #将在shell终端运行,即/bin/sh -c格式二: 使用exec 执行RUN ["executable", "param1", "param2"]格式三:RUN ["sh","-c","echo hello"]注意:1.每条RUN指令将在当前镜像基础上执行,并提交为新的镜像,可以使用 \ 换行2.exec形式将会作为json数组来解析,需要"" 而不能使用''3.shell形式,或者exec的shell形式环境变量都会起作用4.RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
CMD:指定容器启动执行的命令;启动容器中的服务时执行,只能在dockerfile中使用一次,如果有多个只有最后一个生效,其余的均被覆盖。
格式一:CMD ["executable", "param1", "param2"](可执行文件优先)格式二:CMD "param1","param2"格式三:CMD command param1 param2示例:CMD echo "this is a test" |wc -m (统计字符数)
CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了
LABEL:指定生成镜像的源数据标签
格式一LABEL <key>=<value>示例:LABEL version="1.0" description="示例一" by="记录"
EXPOSE:指定镜像容器监听端口号
EXPOSE <port> [<port>]
ENV:指定一次环境变量,可以被后续的RUN指令使用
格式一:ENV <key> <value> #只能设置一个变量格式二:ENV <key>=<value> #可以设置多个变量示例一:ENV myName linn示例二:ENV name="linn" age=12
ARG:与ENV作用基本一致,区别在于构建的过程中使用,不会保留到容器中。
示例一ARG JAR_FILE=build/libs/*.jar
ADD:将数据移动到指定的目录;对压缩文件进行解压缩;可以访问网络资源
格式:ADD <src>...<dest>ADD ["<src>",..."<dest>"] 用于支持包含空格的路径示例:ADD home* /mydir/ 添加全部的hom开头文件到/mydir 目录路径必须是绝对路径,如果不存在会自动创建路径必须要是dockerfile所在路径的相对路径如果是一个目录,只会复制目录下的内容,而不会复制目录本身
COPY:复制宿主机数据到镜像内部使用,与ADD类似,但是不会自动解压,不能访问网络资源。
COPY <src>...<desc>
WORKDIR:切换容器中的当前路径,在workdir中需要使用绝对路径,如果镜像中路径不存在,则会自动创建此目录。使用workdir来替代RUN cd
# 如下操作会将宿主机的test.txt 文件复制到 镜像的/tmp/test.txt。WORKDIR /tmpCOPY test.txt .
VOLUME:挂载数据卷到镜像容器中
USER:指定运行容器的用户
USER daemon
ONBUILD:用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
ENTRYPOINT:指定运行容器启动过程执行命令,并且不可被docker run 参数覆盖,而覆盖CMD参数,如果需要覆盖可以使用 docker run —entrypoint
格式一:ENTRYPOINT "executable","param1", "param2"格式二:ENTRYPOINT command param1 param2示例:ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "foregound"]
示例:基于springboot2.3
FROM openjdk:11 as builderWORKDIR applicationARG JAR_FILE=build/libs/*.jarCOPY ${JAR_FILE} application.jarRUN java -Djarmode=layertools -jar application.jar extractFROM openjdk:11WORKDIR applicationENV JAVA_OPT "-Xms500m -Xmx500m -Duser.timezone=Asia/Shanghai -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8"ENV SPRINGBOOT_OPT "--spring.profiles.active=dev --logging.config=/app/config/logback-spring.xml"ENV PROPERTIES_FILE "/app/config/application.properties"ENV LOG_PATH "/app/log/"COPY --from=builder application/dependencies/ ./COPY --from=builder application/spring-boot-loader/ ./COPY --from=builder application/snapshot-dependencies/ ./COPY --from=builder application/application/ ./ENTRYPOINT ["sh", "-c", "java ${JAVA_OPT} org.springframework.boot.loader.JarLauncher ${SPRINGBOOT_OPT}"]
