Dockerfile常用指令
利用Dockerfile构建镜像比较方便快捷,在编写Dockerfile文件中我们需要用到很多常用的指令,为了方便以后使用,具体用法及说明在此记录一下,如有错误请及时指出,谢谢!
FROM指令:
FROM <image>
FROM <image>:<tag>
image必须是已存在的镜像
作为将要构建的镜像的基础镜像
必须是第一条非注释的指令
例如:
FROM ubuntu:latest
MAINTAINER指令:
MAINTAINER<name>
指定镜像的作者信息,包含镜像的所有者和联系信息
例如:
MAINTAINER fngje "fngje0128@163.com"
RUN指令:(在镜像构建过程运行)
RUN <command> (shell模式) /bin/bash -c command RUN echo hello world RUN apt-get update RUN apt-get install -y nginx
每一个RUN命令都会在当前镜像的上层创建一个新的镜像来运行指定的命令。
EXPOSE指令:
EXPOSE <potrt>[<potrt>...]
指定运行该镜像的容器使用的端口,可以指定一个或多个端口,"EXPOSE 80"
虽然在EXPOSE指令中已经暴露了80端口,但是在启动容器的时候还是要指定端口信息,容器本身不会自动暴露端口,例如:
docker run -p 80 -d jie/nginx nginx -g "daemon off;"
CMD指令:(在容器运行时运行,docker run启动容器时如果指定了容器运行时的命令,那么CMD指令会被覆盖,不会执行)
CMD [ "executable","param1","param2" ](exec模式) CMD command param1 param2 (shell模式) CMD ["param1","param2"](作为ENTERYPOINT指令的默认参数)
ENTERYPOINT指令:(不会被docker run启动容器时指定的指令覆盖,如果要覆盖,可以使用docker run --entrypoint覆盖)
ENTERYPOINT ["executable","param1","param2"] (exec模式) ENTERYPOINT command param1 param2 (shell模式)
ADD指令:
ADD <src>...<dest> ADD ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
COPY指令:
COPY <src>...<dest> COPY ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
如下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;"]
ADD与COPY指令对比:
- ADD包含类似tar的解压功能
- 如果单纯复制文件,Docker推荐使用COPY
VOLUME指令:(用于向基于镜像创建的容器添加卷,一个卷可以存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统,并提供共享数据、数据持久化的功能)
VOLUME ["/data"]
WORKDIR指令:(用来在从镜像创建新容器时,在容器内部设置工作目录,ENTERYPOINT或者CMD指令都会在这个目录下执行)
WORKDIR /path/to/workdir
通常使用绝对路径,如果是相对路径,那么工作路径会一直传递下去。相对路径结果如下所示:
WORKDIR /a WORKDIR b WORKDIR c RUN pwd #输出结果: "/a/b/c"
ENV指令:(用来设置环境变量与WORDDIR类似,在构建和运行中都生效)
ENV <key><value>
ENV <key>=<value>...
USER指令:(用来指定镜像以哪个用户去运行,基于该镜像启动的容器也会以该用户去运行)
USER daemon
USER nginx
可以使用 UID GID 用户组,默认使用root用户
USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
ONBUILD指令:(为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行,当子镜像在构建时,会执行触发器中的指令)
ONBUILD [INSTRUCTION]
可以看下面的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;"]
构建这个镜像之后,以这个镜像为基础构建的新的nginx镜像就会执行ONBUILD指令中复制index.html文件,nginx的主页文件就会是当前Dockerfile同级目录中的index.html的内容。