shuai
发布于 2024-01-11 / 47 阅读
0
0

Dockerfile文件详解

1: from

指定基础镜像,必须在 Dockerfile 文件的第一行,格式如下:

  • from image:tag
  • from image,不指定 tag 则会拉取最新的版本(latest)

2:maintainer

维护者信息:格式如下:

  • maintainer name

3:run

构建镜像时执行命令并创建新的镜像层, 经常用于安装软件包。例如:在 Alpine Linux 的 Docker 镜像中安装 curl

    FROM alpine:latest
    RUN apk add --update curl && rm -rf /var/cache/apk/*

run 命令后有两种格式,两则区别在于 shell 会解析系统变量(如:$hostname),而 exec 不会解析变量(原样输出)

  • shell 执行格式:RUN command
  • exec 执行格式:RUN ["可执行文件或命令", "param1", "param2"]

注:RUN 指令每次都会创建一层镜像,多个命令可以使用 && 隔开,并且中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定 --no-cache 参数,如:docker build --no-cache

4:workdir

工作目录,只针对容器
如下 Dockerfile 文件:

    from 192.168.235.142:9001/dmp-jdk8:v1
    maintainer shuai
    workdir /app
    copy /jar/work_test.jar ./work_test.jar
    entrypoint ["java", "-jar", "./work_test.jar"]

指定了 workdir 则代表下面所有容器的操作都是基于 /app 目录操作的,copy 目标路径使用 ./work_test.jar,代表会将 /jar/work_test.jar 文件拷贝到 /app/work_test.jar,后续 run cmd 和 entrypoint 命令也全都是基于工作目录 /app 的

5:copy

将宿主机中的文件或目录(可规则匹配)复制到容器中,格式:copy 源路径 目标路径

  • 源路径:基于容器上下文路径,可以使用相对路径,也可以使用容器上下文下的绝对路径
  • 目标路径:可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录

如:Dockerfile 文件如下:

    from 192.168.235.142:9001/dmp-jdk8:v1
    maintainer shuai
    workdir /app
    copy /jar/work_test.jar ./work_test.jar
    entrypoint ["java", "-jar", "./work_test.jar"]

构建镜像命令:docker build -t w:1 -f /usr/local/dockerfile/Dockerfile /usr/local/dockerfile
则代表:拷贝基于容器上下文(/usr/local/dockerfile)目录下的 /jar 目录下的 work_test.jar 文件,到容器的 /app 工作路径下

6: add

和 copy 功能类似,会自动解压文件,可以访问网络资源

7: cmd 和 entrypoint

  • 都是在容器运行时执行的
  • cmd 为启动容器提供默认的命令和参数,因为是默认的所以不一定会执行,可以被 docker run 后面的参数取代,多个 cmd 后者会覆盖前者
  • entrypoint 则一定会执行,docker run 后面的参数只会作为参数传递给 entrypoint,可以使用 docker run 命令中的 --entrypoint 选项显式覆盖,多个 entrypoint 后者会覆盖前者
  • 当 docker 客户端命令 docker run 中带有参数时,守护进程将忽略 Dockerfile 中定义的 cmd 指令,
    而 entrypoint 不会被忽略,命令行上的参数被附加到 entrypoint 指定的命令的参数列表中

如 cmd:

    from 192.168.235.142:9001/dmp-jdk8:v1
    workdir /app
    copy /jar/work_test.jar ./work_test.jar
    cmd ["java", "-jar", "./work_test.jar"]

然后构建并运行 docker run 镜像名称 java -Xmx256m -jar ./work_test.jar,则会使用 java -Xmx256m -jar ./work_test.jar 替换掉 java -jar ./work_test.jar

如 entrypoint:

    from 192.168.235.142:9001/dmp-jdk8:v1
    workdir /app
    copy /jar/work_test.jar ./work_test.jar
    entrypoint ["java", "-jar", "./work_test.jar"]

然后构建并运行 docker run 镜像名称 java -Xmx256m -jar ./work_test.jar,则不会覆盖 java -jar ./work_test.jar,会将 java -Xmx256m -jar ./work_test.jar 作为参数传递过去,结果就变成了 java -jar ./work_test.jar java -Xmx256m -jar ./work_test.jar

8:env

设置环境变量,在容器启动时可以替换

    from 192.168.235.142:9001/dmp-jdk8:v1
    maintainer shuai
    workdir /app
    copy /jar/work_test.jar ./work_test.jar
    ENV APP_ENV=dev
    entrypoint ["java", "-Dspring.profiles.active=${APP_ENV}", "-jar", "./work_test.jar"]

启动命令:docker run -e APP_ENV=test --name=tt3 -p=8088:8088 w:1


评论