0%

Dockerfile指令详解

ADD

复制文件

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

示例:

1
ADD SpringBoot-Demo.jar app.jar

ARG

设置构建参数

类似于ENV,ARG设置的是构建时的环境变量,在容器运行时是不存在这些变量的。而用户可以在构建期间使用docker build命令和参数--build-arg=对这个变量复制。如果你再Dockerfile中使用ARG定义了变量但未给出初始值,在docker build的时候未赋值会报错。

  • 建议敏感数据不使用ARG。

  • 不像ARG指令,ENV指令的值会始终存在于镜像中。

示例

1
2
3
4
ARG user=root //指定默认值
# or
ARG user //先声明
docker build --build-arg user=root //再赋值

ENV

在镜像构建过程中设置环境变量

示例

1
ENV JAVA_HONE /java

COPY

复制文件

与ADD类似,COPY不支持URL和压缩包

示例

1
COPY a.sh /testdir/

CMD

为执行容器提供默认值

每个Dockerfile只有一个CMD命令,如果指定了多条,那么只有最后一条会被执行,如果用户在docker run指定参数,则会覆盖掉CMD指定的默认参数。

注意:不要把RUN和CMD搞混了。RUN实际上是在构建镜像时执行命令并提交执行结果到镜像;而CMD在构建期间不会执行任何命令,只是为镜像预先设置容器运行时的命令或参数。

示例

1
CMD ["echo","just for test"]

ENTRYPOINT

入口点

表示镜像在初始化时需要执行的命令,不可被重写覆盖,而CMD是可以被重写覆盖的。

ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效,多个存在,只有最后一个生效,其它无效。

需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令。

示例

1
ENTRYPOINT sh /testdir/a.sh

RUN

执行命令

示例

1
2
3
RUN chown -R root:root /testdir/ && \
chmod 550 /testdir/ && \
echo "just for test"

EXPOSE

声明在运⾏时容器提供服务的端⼝

1
EXPOSE 8080

FROM

指定基础镜像

1
FROM centos

LABEL

为镜像添加元数据

示例

1
LABEL version=1.0.0

MAINTAINER(已过时)

指定维护者信息

示例

1
MAINTAINER zt<111@qq.com>

USER

设置用户

写在该指令后的RUN、CMD以及ENTRYPOINT指令都将
使⽤该⽤户执⾏命令

示例

1
USER root

WORKDIR

指定工作目录

写在该指令后的 RUN , CMD 以及 ENTRYPOINT 指令都将该⽬录作为当前⽬录,并执⾏相应的命令

示例

1
WORKDIR /workdir

VOLUME

指定挂载点

该指令使容器中的⼀个⽬录具有持久化存储的功能,该⽬录可被容器本身使⽤,也可共享给其他容器。当容器中的应⽤有持久化数据的需求时可以在Dockerfile中使⽤该指令。

示例

1
VOLUME /tmp