文章目录
- ADD 复制文件
- COPY 复制文件
- ARG 设置构建参数
- CMD 容器启动命令
- ENTRYPOINT ⼊⼝点
- ENV 设置环境变量
- EXPOSE 声明暴露的端⼝
- FROM 指定基础镜像
- LABEL 为镜像添加元数据
- MAINTAINER 指定维护者的信息
- RUN 执⾏命令
- USER 设置⽤户
- VOLUME 指定挂载点
- WORKDIR 指定⼯作⽬录
ADD 复制文件
从 src ⽬录复制⽂件到容器的 dest,其中 src 可以是 Dockerfile 所在⽬录的相对路径,可以是⼀个URL,也可以是⼀个压缩包
格式:
- ADD src… dest
- ADD [“src”,… “dest”]
注意:
- src 必须在构建的上下文内,不能使⽤例如: ADD …/somethine /something 这样的命令,因为 docker build 命令⾸先会将上下⽂路径和其⼦⽬录发送到docker daemon
- 如果 src 是一个URL,同时 dest 不以斜杠结尾,dest 将会被视为文件,src 对应的文件内容将会被下载到 dest
- 如果 src 是一个URL,同时 dest 以斜杠结尾,dest 将会被视为目录,src 对应内容将会被下载到 dest 目录
- 如果 src 是一个目录,那么整个目录下的内容将会被拷贝,包括文件系统元数据
- 如果文件是可识别的压缩包格式,则 docker 会自动解压
COPY 复制文件
复制本地端的 src 到容器的 dest。COPY指令和ADD指令类似,COPY不⽀持URL和压缩包
格式:
- COPY src… dest
- COPY [“src”,… “dest”]
ARG 设置构建参数
ARG指令⽤于设置构建参数,类似于ENV。和ARG不同的是,ARG设置的是构建时的环境变量,在容器运⾏时是不会存在这些变量的,例如: ARG user1=someuser
格式:
- ARG name[=default value]
CMD 容器启动命令
CMD指令⽤于为执⾏容器提供默认值。每个Dockerfile只有⼀个CMD命令,如果指定了多个CMD命令,那么只有最后⼀条会被执⾏,
如果启动容器的时候指定了运⾏的命令,则会覆盖掉CMD指定的命令
格式:
- CMD [“executable”,“param1”,“param2”]
- CMD [“param1”,“param2”] (为ENTRYPOINT指令提供预设参数)
- CMD command param1 param2 (在shell中执⾏)
ENTRYPOINT ⼊⼝点
ENTRYPOINT和CMD指令的⽬的⼀样,都是指定Docker容器启动时执⾏的命令,可多次设置,但只有最后⼀个有效。
ENTRYPOINT不可被重写覆盖
格式:
- ENTRYPOINT [“executable”, “param1”, “param2”]
- ENTRYPOINT command param1 param2
ENV 设置环境变量
例如: ENV JAVA_HOME /path/to/java
格式:
- ENV key value
- ENV key=value …
EXPOSE 声明暴露的端⼝
⽤于声明在运⾏时容器提供服务的端⼝
格式:
- EXPOSE port [port…]
注意:
- 这只是⼀个声明,运⾏时并不会因为该声明就打开相应端⼝
- 该指令的作⽤主要是帮助镜像使⽤者理解该镜像服务的守护端⼝
- 当运⾏时使⽤随机映射时,会⾃动映射 EXPOSE 的端⼝
# 声明暴露⼀个端⼝示例
EXPOSE port1
# 相应的运⾏容器使⽤的命令
docker run -p port1 image
# 也可使⽤-P选项启动
docker run -P image
# 声明暴露多个端⼝示例
EXPOSE port1 port2 port3
# 相应的运⾏容器使⽤的命令
docker run -p port1 -p port2 -p port3 image
# 也可指定需要映射到宿主机器上的端⼝号
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
FROM 指定基础镜像
使⽤ FROM 指令指定基础镜像,FROM指令有点像Java⾥⾯的 “extends” 关键字。需要注意的是,FROM指令必须指定且需要写在其他指令之前,FROM指令后的所有指令都依赖于该指令所指定的镜像。
格式:
- FROM image
- FROM image:tag
- FROM image@digest
LABEL 为镜像添加元数据
格式:
- LABEL key=value key=value key=value …
# 使⽤ """和"\"转换命令⾏,示例:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
MAINTAINER 指定维护者的信息
该指令现已过时,建议适用如下形式:
LABEL maintainer=“dsd2333”
RUN 执⾏命令
- RUN command 在shell终端中运⾏,在 Linux 中默认是
/bin/sh -c
,在 windows 中是cmd /s/c
,使⽤这种格式,就像直接在命令⾏中输⼊命令⼀样。- RUN [“executable”, “param1”,“param2”] 使⽤exec执⾏,这种⽅式类似于函数调⽤。指定其他终端可以通过该⽅式操作,例如: RUN [“/bin/bash”, “-c”, “echo hello”] ,该⽅式必须使⽤双引号["]⽽不能使⽤单引号['],因为该⽅式会被转换成⼀个JSON 数组。
格式:
- RUN command
- RUN [“executable”, “param1”, “param2”]
USER 设置⽤户
该指令⽤于设置启动镜像时的⽤户或者UID,写在该指令后的RUN、CMD以及ENTRYPOINT指令都将使⽤该⽤户执⾏命令
格式:
- USER 用户名
VOLUME 指定挂载点
该指令使容器中的⼀个⽬录具有持久化存储的功能,该⽬录可被容器本身使⽤,也可共享给其他容器。当容器中的应⽤有持久化数据的需求时可以在Dockerfile中使⽤该指令
格式:
- VOLUME [“/data”]
当该Dockerfile被构建成镜像后,/tmp⽬录中的数据即使容器关闭也依然存在。如果另⼀个容器也有持久化的需求,并且想使⽤以上容器/tmp⽬录中的内容,则可使⽤如下命令启动容器:
docker run -volume-from 容器ID 镜像名称 # 第⼀个容器的ID 第⼆个容器所使⽤的镜像
WORKDIR 指定⼯作⽬录
切换⽬录指令,类似于cd命令,写在该指令后的 RUN , CMD 以及 ENTRYPOINT 指令都将该⽬录作为当前⽬录,并执⾏相应的命令
格式:
- WORKDIR /path/to/workdir