Dockerfile的理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile的理解相关的知识,希望对你有一定的参考价值。

Dockerfile文件详解

Docker镜像的制作有docker commit 和Dockerfile,官方推荐使用Dockerfile来制作

通过一个实例来看下docker镜像的制作过程:

1、创建一个Dockerfile的文件

2、在文件中写入下面代码:

FROM ubuntu
RUN apt-get install -y vim

3、执行docker bulid命令来构建镜像

docker build -t new-ubuntu .

这条命令-t参数指定新的镜像的名称;点“.” 代表的是Dockerfile文件的路径,由于案例的Dockerfile就在当前目录下面所以就用点符号来标识

从这个输出中我们可以看到真正的构建过程 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。

Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。

此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。


所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。


Dockerfile文件中的其他关键字

FROM 是基于那个基础镜像

RUN 需要安装的软件

MAINTAINER 镜像创建者的信息

CMD :容器启动时需要执行的命令;但是在一个Dockerfile文件中只能有一个CMD命令,如果有多个,只执行最后一个CMD命令

如果在启动容器的时候指定了命令,那么这个命令会替换掉容器镜像中默认写的CMD命令

ENTRYPOINT:

container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条

ENTRYPOINT没有CMD的可替换特性

USER:使用那个用户跑容器

例如:

ENTRYPOINT ["memcached"]

USER daemon

EXPOSE:容器内部开启的端口,主机上使用还得在启动容器的时候做端口映射 

docker run -p 80:80 xxx

ENV: 设置环境变量

例如:

ENV LANG en_US.UTF-8

ENV LC_ALL en_US.UTF-8

ADD:将文件<src>拷贝到container的文件系统对应的路径<dest>


所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0


如果文件是可识别的压缩格式,则docker会帮忙解压缩



如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下

如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。比如:


docker build github.com/creack/docker-firefox


docker-firefox目录下必须有Dockerfile和要ADD的文件



注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD

url file.


ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。


VOLUME



可以将本地文件夹或者其他container的文件夹挂载到container中。


WORKDIR



切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效


ONBUILD



ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行


参考文献:

http://cloudman.blog.51cto.com/10425448/1923921

http://blog.csdn.net/wsscy2004/article/details/25878223


本文出自 “圈中一鸟” 博客,谢绝转载!

以上是关于Dockerfile的理解的主要内容,如果未能解决你的问题,请参考以下文章

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

如何理解这段代码片段中的两对括号?

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)

以下代码片段 C++ 的说明

Docker——Dockerfile的理解 & 案例实操