Docker Dockerfile详解

在前面的一篇文章中,我们介绍了如何构建镜像,其中使用Dockerfile文件是最为常用的一种方式,在本篇文章中我们将详细介绍Dockerfile构建镜像的过程以及其命令参数等等。

首先我们来看看Dockerfile构建镜像的过程:

  1. 从基础镜像运行一个容器
  2. 执行一条指令对容器做出修改
  3. 执行类似docker commit的操作,提交一个新的镜像层
  4. 再基于刚提交的镜像运行一个容器
  5. 执行Dockerfile的下一条指令,直至所有的指令执行完毕

从上述构建镜像的过程中我们知道使用Dockerfile的过程中会构建多个中间镜像。这样给我带来了极大的好处,当构建镜像的过程中如果出错就可以使用中间层镜像进行调试。

在了解了Dockerfile构建镜像的整个过程之后,下面我们来看看Dockerfile文件的格式以及一些主要指令。

在Dockerfile文件中,可以使用“#”开头作为注释。其中指令全部大写,格式如下:

INSTRUCTION argument

在Dockerfile中主要有以下指令:

FROM
RUN
MAINTAINER
EXPOSE
CMD
ENTRYPOINNT
ADD
COPY
VOLUME
WORKDIR
ENV
USER
ONBUILD

FROM指令用来指定基础镜像,是指已经存在的镜像,必须是第一条非注释指令。

MAINTAINER <name>指令用来指定镜像的作者的信息。

RUN指令用来指定当前镜像中运行的命令,它有两种运行格式:

RUN <command>(shell模式)
RUN ["executable","param1","param2"] (exec模式)

EXPOSE <port> [<port>...]指令用来指定运行该镜像的容器使用的端口。(需要主要的是Docker不会自动打开该端口,所以运行命令时需要我们使用-p参数来打开)。

CMD指令是用于在容器运行时执行命令的,如果在容器运行时指定命令,将会覆盖这里设置的值。它有下面两种设置方式:

CMD ["executable","param1","param2"]  (exec模式)
CMD command param1 param2 (shell模式)

如下例所示:

CMD ["/usr/sbin/nginx","-g","daemon off;"]

ENTRYPOINT指令和CMD类似,但是在容器运行时指定命令并不会覆盖设置的值。它也有两种运行模式:

ENTRYPOINT ["executable","param1","param2"]  (exec模式)
ENTRYPOINT command param1 param2 (shell模式)

如下例所示:

ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]

COPY以及ADD的指令用于将一个文件拷贝到使用Dockerfile文件构建的镜像中,如使用下面命令将一个网页复制到nginx的根目录下:

COPY index.html /usr/share/nginx/html

如果只是单纯的复制功能,Docker推荐使用COPY指令,ADD指令包含了类似tar的解压功能。

WORKDIR指令用来指定Docker的工作目录。

ENV <key> <value>指令用来设置环境变量。

USER指令用来指定运行镜像会用什么样的用户来运行。

ONBUILD是指镜像触发器,当一个镜像被其他镜像作为基础镜像时执行
如Dockerfile文件的内容如下所示:

FROM ubuntu:14.04
MAINTAINER ljcan "2671268148@qq.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
#CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
ONBUILD COPY index.html /usr/share/nginx/html

接着我们构建一个镜像:

docker build -t="test_onbuild" .

然后运行容器,如下图所示,可以看到docker并没有将index.html拷贝到nginx的目录下:
在这里插入图片描述
那要让它实现COPY功能该怎么做呢?我们修改脚本:

#刚刚创建的镜像作为基础镜像
FROM test_onbuild
MAINTAINER ljcan "2671268148@qq.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
#CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
ONBUILD COPY index.html /usr/share/nginx/html

然后重新构建镜像:

docker build -t="test_onbuild1" .

然后运行容器,就可以看到已经将index.html拷贝到nginx的目录下:
在这里插入图片描述
至此,本篇文章讲述完Dockerfile文件构建镜像的过程以及它的主要指令,如果有任何问题欢迎留言讨论,谢谢!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值