阅读 23

Dockerfile指令详解

此文章已同步更新至我的个人博客simonting.gitee.io


ADD

复制文件

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

示例:

ADD SpringBoot-Demo.jar app.jar
复制代码

ARG

设置构建参数

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

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

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

示例

ARG user=root //指定默认值
# or
ARG user //先声明
docker build --build-arg user=root //再赋值
复制代码

ENV

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

示例

ENV JAVA_HONE /java
复制代码

COPY

复制文件

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

示例

COPY a.sh /testdir/
复制代码

CMD

为执行容器提供默认值

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

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

示例

CMD ["echo","just for test"]
复制代码

ENTRYPOINT

入口点

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

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

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

示例

ENTRYPOINT sh /testdir/a.sh
复制代码

RUN

执行命令

示例

RUN chown -R root:root /testdir/ && \
chmod 550 /testdir/ && \
echo "just for test"
复制代码

EXPOSE

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

EXPOSE 8080
复制代码

FROM

指定基础镜像

FROM centos
复制代码

LABEL

为镜像添加元数据

示例

LABEL version=1.0.0
复制代码

MAINTAINER(已过时)

指定维护者信息

示例

MAINTAINER zt<111@qq.com>
复制代码

USER

设置用户

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

示例

USER root
复制代码

WORKDIR

指定工作目录

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

示例

WORKDIR /workdir
复制代码

VOLUME

指定挂载点

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

示例

VOLUME /tmp
复制代码