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