Dockerfile常用指令

  利用Dockerfile构建镜像比较方便快捷,在编写Dockerfile文件中我们需要用到很多常用的指令,为了方便以后使用,具体用法及说明在此记录一下,如有错误请及时指出,谢谢!

 

FROM指令:

FROM <image>
FROM <image>:<tag>
View Code

 image必须是已存在的镜像

作为将要构建的镜像的基础镜像
必须是第一条非注释的指令
例如:

FROM ubuntu:latest
View Code

 

MAINTAINER指令:

MAINTAINER<name>
View Code

指定镜像的作者信息,包含镜像的所有者和联系信息

例如:

MAINTAINER fngje "fngje0128@163.com"
View Code

 

RUN指令:(在镜像构建过程运行)

RUN <command>    (shell模式)
    /bin/bash -c command
    RUN echo hello world
RUN apt-get update
RUN apt-get install -y nginx
View Code

每一个RUN命令都会在当前镜像的上层创建一个新的镜像来运行指定的命令。

EXPOSE指令:

EXPOSE <potrt>[<potrt>...]
View Code

指定运行该镜像的容器使用的端口,可以指定一个或多个端口,"EXPOSE 80"

虽然在EXPOSE指令中已经暴露了80端口,但是在启动容器的时候还是要指定端口信息,容器本身不会自动暴露端口,例如:

docker run -p 80 -d jie/nginx nginx -g "daemon off;"
View Code


CMD指令:(在容器运行时运行,docker run启动容器时如果指定了容器运行时的命令,那么CMD指令会被覆盖,不会执行)

CMD [ "executable","param1","param2" ](exec模式)
CMD command param1 param2 (shell模式)
CMD ["param1","param2"](作为ENTERYPOINT指令的默认参数)
View Code

 

ENTERYPOINT指令:(不会被docker run启动容器时指定的指令覆盖,如果要覆盖,可以使用docker run --entrypoint覆盖)

ENTERYPOINT ["executable","param1","param2"] (exec模式)
ENTERYPOINT command param1 param2 (shell模式)
View Code

 

ADD指令:

ADD <src>...<dest>
ADD ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
View Code

 

COPY指令:

COPY <src>...<dest>
COPY ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
View Code

如下Dockerfile

#use centos build nginx images
FROM centos:latest
MAINTAINER fngje "fngje0128@163.com"
RUN yum update
RUN yum install -y nginx
COPY index.html /usr/share/nginx/html
EXPOSE 80
CMD ["/usr/sbin/nginx","-g","daemon off;"]
View Code

 

ADD与COPY指令对比:

  1. ADD包含类似tar的解压功能
  2. 如果单纯复制文件,Docker推荐使用COPY

VOLUME指令:(用于向基于镜像创建的容器添加卷,一个卷可以存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统,并提供共享数据、数据持久化的功能)

VOLUME ["/data"]
View Code

 

WORKDIR指令:(用来在从镜像创建新容器时,在容器内部设置工作目录,ENTERYPOINT或者CMD指令都会在这个目录下执行)

WORKDIR /path/to/workdir
View Code

通常使用绝对路径,如果是相对路径,那么工作路径会一直传递下去。相对路径结果如下所示:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
#输出结果:
"/a/b/c"
View Code

 

ENV指令:(用来设置环境变量与WORDDIR类似,在构建和运行中都生效)

ENV <key><value>
ENV <key>=<value>...
View Code

 

USER指令:(用来指定镜像以哪个用户去运行,基于该镜像启动的容器也会以该用户去运行)

USER daemon
    USER nginx
View Code

可以使用 UID GID 用户组,默认使用root用户

USER user            USER uid
USER user:group        USER uid:gid
USER user:gid                USER uid:group
View Code

 

ONBUILD指令:(为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行,当子镜像在构建时,会执行触发器中的指令)

ONBUILD [INSTRUCTION]
View Code

可以看下面的Dockerfile文件:

#use centos build nginx images
FROM centos:latest
MAINTAINER fngje "fngje0128@163.com"
RUN yum install -y wget
WORKDIR  /etc/yum.repos.d/
RUN mkdir -p tmp/ && mv /etc/yum.repos.d/* tmp
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.c
om/repo/epel-7.repo
RUN yum install -y nginx
ONBUILD index.html /usr/share/nginx/html
EXPOSE 80
CMD ["/usr/sbin/nginx","-g","daemon off;"]
View Code

构建这个镜像之后,以这个镜像为基础构建的新的nginx镜像就会执行ONBUILD指令中复制index.html文件,nginx的主页文件就会是当前Dockerfile同级目录中的index.html的内容。

posted @ 2017-07-19 17:38  StaryJie  阅读(343)  评论(0编辑  收藏  举报