Dockerfile 是docker镜像制作的主要配置文件,要制作自己的原生态镜像,就需要编写dockerfile,下面我们看看dockerfile的编写规则
Dockerfile由一组指令构成,用户使用该文件构建docker镜像,编写规则如下:
1 所有的注释以#开头
2 在Dockerfile中的第一个指令必须是FROM指令,FROM 指定新镜像是从哪个基础镜像构建的,FROM可以出现多次,创建多个镜像。一般建议第二个指令时MAINTAINER,代表该镜像由谁维护
3 接下来要在镜像中安装包和应用程序,这时RUN指令就出场了。RUN指令在镜像中执行我们的命令。也可以在运行镜像时直接安装软件,例如docker.io run imagename command 该命令和Dockerfile中的RUN等效的
4 CMD指令则是告诉docker在容器创建后运行什么命令,每个指令都是独立执行的
5 ENTRYPOINT指令则允许你在容器启动后立即触发一个命令,比CMD要更前.....
6 USER指令指定你的应用程序以哪个账户执行
7 EXPOSE指令指定一个端口,这个容器的应用程序的端口会和系统中的一个端口相映射,在容器外部访问该端口时,要使用映射后的端口。docker.io ps命令可以查看 然后就可以构建镜像了,使用build参数构建。例如docker.io build -t="my_nginx_image" . -t 指定镜像名称下面看看Dockerfile指令的详细解释:
FROM FROM指令必须是Dockerfile中的第一个指令,可以多次出现,用来创建多个容器,如果在FROM指令后面没有指定tag,则默认是最新版的。
MAINTAINER 介绍作者等信息
RUN RUN指令用来执行任何命令并提交结果。提交的结果可以在Dockerfile的下一步中使用,RUN有两种模式:1 RUN <COMMAND> 2 RUN ["executable","param1","param2"]
CMD 在Dockerfile中只能有一个CMD,如果有多个CMD指令,只有最后一个CMD指令生效,当你在CMD执行shell格式的命令,命令默认会在/bin/sh -c中执行,如果你执行你的命令不是shell格式的,则需要把你的命令组织成JSON格式,JSON格式的CMD命令优先级高。例如 CMD echo "This is a test."或者CMD ["/usr/bin/wc","--help"],还有一种格式是JSON格式,不过JSON里面不用指明执行的命令,只要指明参数,这些参数默认是ENTRYPOINT指令的。如果用户在命令行指定了run的命令,则会覆盖配置文件中的配置。RUN actually runs a command and commits the result; CMD does not execute anything at build time, but specifies the intended command for the image.
EXPOSE 该指令通知docker,容器监听在一个指定的端口上。
ENV ENV指令设置一个环境变量,这些值会传递到RUN指令执行时的环境上
ADD 该指令会从源地址拷贝一个文件到容器里面。ADD <src> <dest> 。src是一个文件或者相关目录,dest是容器里面的一个绝对路径。所有文件及目录权限都是0755,UID/GID都是0。7 如果<dest>不是以“/”结尾的,则会被认为是文件
COPY COPY和ADD的作用差不多,不同的是ADD的src参数可以是一个URL, 而且如果ADD的src是一个支持的压缩包格式,则会被自动解压。
ENTRYPOINT 只能有一个ENTRYPOINT指令在Dockerfile文件中,如果有多个该指令,则最后一个指令生效。ENTRYPOINT帮助你配置容器,ENTRYPOINT指令作为命令入口是不能被docker.io run覆盖的,而CMD指令是可以被覆盖的。ENTRYPOINT也是有两种格式的。1 ENTRYPOINT ["executable","param1","param2"] , 2 ENTRYPOINT command param1
VOLUME 该参数会根据指定的名称创建一个挂载点,并且从自然主机上挂载volumes卷。
USER 该参数设置镜像以哪个用户运行
WORKDIR 该参数设置RUN、CMD、ENTRYPOINT等参数的工作目录。该参数可以被多次使用,如果提供的目录是相对目录,他会在上一个WORKDIR的基础上进行设置
ONBUILD 该令用来设置一些触发的指令,用于在当该镜像被作为基础镜像来创建其他镜像时执行一些操作,ONBUILD中定义的指令会在用于生成其他镜像的Dockerfile文件的FROM指令之后被执行,任何一个指令都可以用于ONBUILD指令,可以用来执行一些因为环境而变化的操作,使镜像更加通用。
根据dockerfile有几种不同的方法来构建镜像:
1 如果你的Dockerfile就在当前目录,则使用docker.io build . 来构建 。
2 从标准输入读取Dockerfile,docker.io build - < Dockerfile
3 从github来构建,docker build github.com/creack/docker-firefox注意:在构建完成后,一般会返回一个image id,你在用docker images查看的时候,也是看到的id,而不是镜像名称,你可以在构建时使用-t参数直接指定,也可以使用docker tag命令来帮顶
关于构建镜像的细节,不同的linux发行版使用的软件也不一样,不过最终结果都是把生成的系统镜像目录打包上传到仓库中。debian/ubuntu系列的一般采用debootstrap工具来制作系统镜像。参考:chroot环境构建 或者学习官方文档:自制基础镜像