Bootstrap

Docker 专栏 —— Dockerfile 指令详解

ADD 复制文件

从 src ⽬录复制⽂件到容器的 dest,其中 src 可以是 Dockerfile 所在⽬录的相对路径,可以是⼀个URL,也可以是⼀个压缩包

格式:

  • ADD src… dest
  • ADD [“src”,… “dest”]

注意:

  1. src 必须在构建的上下文内,不能使⽤例如: ADD …/somethine /something 这样的命令,因为 docker build 命令⾸先会将上下⽂路径和其⼦⽬录发送到docker daemon
  2. 如果 src 是一个URL,同时 dest 不以斜杠结尾,dest 将会被视为文件,src 对应的文件内容将会被下载到 dest
  3. 如果 src 是一个URL,同时 dest 以斜杠结尾,dest 将会被视为目录,src 对应内容将会被下载到 dest 目录
  4. 如果 src 是一个目录,那么整个目录下的内容将会被拷贝,包括文件系统元数据
  5. 如果文件是可识别的压缩包格式,则 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…]

注意:

  1. 这只是⼀个声明,运⾏时并不会因为该声明就打开相应端⼝
  2. 该指令的作⽤主要是帮助镜像使⽤者理解该镜像服务的守护端⼝
  3. 当运⾏时使⽤随机映射时,会⾃动映射 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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;