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 param2ENTRYPOINT 和 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/