Dockerfile完全指南_常见的13种指令上

发布时间 2023-06-30 17:02:51作者: jiang_jiayun

Dockerfile完全指南_常见的13种指令上

image-20211124182808918

FROM

指定基础镜像,必须为第一个命令。

指令格式:

FROM <image>  
FROM <image>:<tag>  

注意:

tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

MAINTAINER

维护者信息

指令格式:

MAINTAINER <name>

示例

 MAINTAINER Jasper Xu   MAINTAINER sorex@163.com  

WORKDIR

工作目录,类似于cd命令

指令格式:

WORKDIR /usr/workdir

示例

WORKDIR /a  (这时工作目录为/a)
WORKDIR b  (这时工作目录为/a/b)
WORKDIR c  (这时工作目录为/a/b/c)

示例

WORKDIR /OPT
RUN mkdir docker
WORKDIR /usr/local
RUN echo "test" > a.info

注意: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

RUN

构建镜像时执行的命令

指令语法:

# 1. shell执行
格式 RUN <command>
# 2. exec执行
格式 RUN ["executable", "param1", "param2"]

示例

WORKDIR /OPT
RUN mkdir docker
WORKDIR /usr/local
RUN echo "test" > a.info

注意:

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

ADD

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。

指令格式:

 ADD <src>... <dest>  
 ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:  

示例

添加所有以"hom"开头的文件

ADD hom* /mydir/ 

? 替代一个单字符,例如:"home.txt"

ADD hom?.txt /mydir/   

添加 "test" 到 WORKDIR/relativeDir/

ADD test relativeDir

添加 "test" 到 /absoluteDir/

ADD test /absoluteDir/

COPY

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。

语法格式:

COPY <源路径>  <目标路径>

示例

COPY ./start.sh /start.sh

CMD

构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。

指令格式:

CMD指令与RUN指令相似,也具有两种格式:
1. shell格式:CMD <命令>
2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]

示例

CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]

注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

ENTRYPOINT

配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

指定容器启动的要运行的命令,可以追加命令

指令格式:

ENTRYPOINT ["executable", "param1", "param2"] 
ENTRYPOINT command param1 param2 (shell内部命令)

示例

ENTRYPOINT ["top", "-b"]

注意:

ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

ENV

这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。

指令格式:

ENV <key>=<value>

示例

ENV JAVA_HOME=/usr/local/jdk1.7.0_79
ENV PATH=$JAVA_HOME/bin:$PATH

EXPOSE

指定于外界交互的端口

指令格式:

EXPOSE

示例

EXPOSE 80

注意:

EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

VOLUME

用于指定持久化目录

指令格式:

VOLUME ["/path/to/dir"]

示例

VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2"]

注意:

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

 
 

USER

USER指令用于将会用以什么样的用户去运行

指令格式:

USER user
USER user:group

注意:

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

ONBUILD

帮助别人定制而准备的

指令格式:

ONBUILD [INSTRUCTION]

示例

FROM centos
WORKDIR /data
ONBUILD RUN mkdir test


FROM test:02