Dockerfile常用指令以及使用案例
1、ADD复制文件
ADD 指令用于复制文件,格式为:
* ADD <src>...<dest>
* ADD ["<src>",..."<dest>"]
从 src 目录复制文件到容器的 dest。其中 src 可以是Dockerfile 所在目录的相对路径,也可以是一个URL,还可以是一个压缩包。
说明:
1)src 必须在构建的上下文内,因为 docker build 命令首先会将上下文路径和其子目录发送到 docker daemon。
2)如果 src 是一个 URL ,同时 dest 不以斜杠结尾,dest 将被视为文件, src 对应内容文件将被下载到 dest 。
3)如果 src 是一个 URL ,同时 dest 以斜杠结尾,dest 将被视为目录,src 对应内容将被下载到 dest 目录。
4)如果 src 是一个目录,那么整个目录下的内容将被复制,包括文件系统元数据。
5)如果文件是可识别的压缩包格式,则 docker 会自动解压。
例如:ADD XXXX-0.0.1-SNAPSHOT.jar app.jar
2、ARG设置构建参数
ARG 指令用于设置构建参数。ARG 指令设置的是构建时的环境变量,在容器运行时不会存在这些变量的。
例如:ARG user1=someuser
3、CMD 容器启动命令
CMD 指令用于为执行容器提供默认值。每个 Dockerfile 只有一个 CMD 命令,如果指定了多个 CMD 命令,那么只有最后一条会被执行,如果启动容器的时指定了运行的命令,则会覆盖CMD 指定的命令。
支持 3 种格式:
1)CMD ["executable","param1","param2"]-----推荐这种方式
2)CMD ["param1","param2"] ------为 ENTRYPOINT 指令提供预设参数
3)CMD command param1 param2 ------- 在 shell 中执行
4、COPY 复制文件
复制文件,格式为:
1)COPY <src>....<dest>
2)COPY ["<src>",..."<dest>"]
复制本地端的 src 到容器的 dest 。COPY指令和 ADD 指令类似,但是 COPY 指令不支持 URL和压缩包。
5、ENTRYPOINT 入口点
格式为:
1)ENTRYPOINT ["executable","param1","param2"]
2)ENTRYPOINT command param1 param2
ENTRYPOINT 和 CMD 指令的目的一样,都是指定 Docker 容器启动时执行的命令,可多次设置,但只有最后一个有效。
6、ENV 设置环境变量
ENV 指令用于设置环境变量,格式为:
1)ENV <key> <value>
2)ENV <key> = <value>...
例如: ENV JAVA_HOME /path/to/java
7、EXPOSE 声明暴露的端口
EXPOSE 指令用于声明在运行时容器提供服务的端口,
格式为:
EXPOSE <port> [<port>...]
注意:这里只是一个声明,运行时并不会因为该声明就打开相应的端口。该指令的作用主要是帮助镜像使用者理解该镜像服务的守护端口;其次是当运行时使用随机映射时,会自动映射 EXPOSE 的端口。
示例:
EXPOSE port1 // 声明暴露一个端口
docker run -p port1 image // 相应的运行容器使用的命令
docker run -P image // 使用 -P 选项启动
EXPOSE port1 port2 port3 // 声明暴露多个端口
docker run -p port1 port2 port3 image // 相应的运行容器使用的命令
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
8、FROM 指定基础镜像
使用 FROM 指令指定基础镜像。FROM 指令必须指定且需要写在其他指令之前。FROM 指令后的所有指令都依赖于该指令所指定的镜像。
支持 3 种格式:
1)FROM <image>
2)FROM <image>:<tag>
3)FROM <image>@<digest>
9、LABEL 为镜像添加元数据
LABEL 指令用于为镜像添加元数据。
格式为: LABEL <key> = <value> <key> = <value> <key> = <value> ...
使用 " " " 和 " \ " 转换命令行,例如:
LABEL "com...." = "ACME...."
LABEL com.x = "foo"
LABEL version = "1.0"
LABEL description = "This text ill \
that label-values can span muttiple lines. "
10、MAINTAINER 指定维护者的信息
MAINTAINER 指令用于指定维护者的信息,用于为 Dockerfile 署名。
格式为: MAINTAINER <name>
11、RUN 执行命令
该指令支持两种格式:
1)RUN <command>
2)RUN ["executable" , "param1" , "param2"]
12、USER 设置用户
USER 指令用于设置启动镜像时的用户或者 UID ,写在该指令后的 RUN 、CMD 以及 ENTRYPOINT 指令都将使用该用户执行命令。
格式为:USER 用户名
例如:USER daemon
13、VOLUME 指定挂载点
VOLUME 指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile 中使用该指令。
格式为:VOLUME ["/data"]
例如:VOLUME /data
14 、WORKDIR指定工作目录
格式为:WORKDIR /path/to/workdir
切换目录指令,类似于 cd 命令,写在该指令后的 RUN 、CMD 以及 ENTRYPOINT 指令都将该目录作为当前目录,并执行相应的命令。
15 其他
扩展内容,可自行阅读 https://docs.docker.com/reference/dockerfile/
16 使用Dockerfile 构建镜像,然后启动、访问服务
一、准备工作
执行下面的命令,将项目构建成 jar 包 :
mvn clean package
二、镜像构建
1)在 jar 包所在目录,创建名为 Dockerfile 的文件
touch Dockerfile
2)在 Dockerfile 文件中添加以下内容
// 基于哪个镜像
FROM java:8
// 将本地文件夹挂载到当前容器
VOLUME /tmp
// 复制文件到容器
ADD xxxx.jar app.jar
// 声明需要暴露的端口
EXPOSE 8761
// 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3)使用 docker build 命令构建镜像
格式:docker build -t 仓库名称/镜像名称(:标签) Dockerfile 相对位置
例如:docker build -t itmuch/xxxx:0.0.1 .
三、启动镜像
docker run -d -p 8761:8761 itmuch/xxxx:0.0.1
四、访问服务
http://Docker宿主机IP:8761/