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