• dockerfile 制作镜像 *

    Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容构建镜像,在介绍如何构建之前先介绍下 Dockerfile 的基本语法结构。

dockerfile 指令选项:
1、FROM
用法: FROM
1)from指定构建镜像的基础源镜像,如果本地没有指定这个镜像,则会自动从docker公共仓库中pull下来
2)from必须是dockerfile中非注释行的第一个命令,也就是说写一个一个dockerfile必须从(除了注释以外)from语句开始
3)from可以在一个dockerfile中出现多次,如果有需求在一个dockerfile中创建多个镜像
4)如果from语句没有指定镜像的标签,则默认就使用latest的标签

2、MAINTAINER
用法: MAINTAINER
指定创建镜像的用户

3、RUN
RUN:两种使用方式
1) RUN
2) RUN "executable","param1","param2"
每条RUN指令是创建镜像是执行的命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个奖项的任何一个历史提交点来创建,类似远吗的版本控制。
exec方式会被解析为一个JSON数组,所以必须使用双引导而不是单引导。exec方式不会调用一个命令shell所以也就不会集成相应的变量
如:RUN [ "echo","$HOME" ] 这种方式是不会达到输出HOME变量的
正确的方式应该是: RUN [ "sh","-c","echo","$HOME" ]
RUN产生的缓存在一次构建的时候是不会失效的,会被重用,可以使用--no-cache选项,即docker build --no-cache ,如此便不会缓存

4、CMD
CMD 有三种使用方式:
1)CMD "executable","param1","param2"
2)CMD "param1","param2"
3)CMD "commamd","param1","param2"
CMD就是容器启动时执行的命令,如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。
注:CMD指令在dockerfile中只能使用一次,如果有多个,则只有最后一个会生效
CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令
CMD会在启动容器的时候执行,build时不执行,而RUN只是在构建的时候执行,后续镜像构建完成后启动容器就与RUN无关了

5、EXPOSE
用法:EXPOSE [...]
告诉docker服务端容器对外映射的本地端口,需要在docker run 的时候使用-p或者-P选项生效

6、ENV
ENV #这样设置只能设置一个变量
ENV = ..... #这样允许写多个变量
例子:
ENV myname="john" myDOg=rex\ the\ dog\
mycat=fluffy
相当于
ENV myName John
ENV myDog Rex The Dog
ENV myCat fluffy

7、ADD
用法:ADD <源地址> <目标地址>
ADD复制本地主机文件、目录或者远程文件URLS 添加到容器指定的路径中去。
支持通过Go的正则模糊匹配
例:
ADD hom* /mydir #以hom开头的所有文件拷贝到容器中的/mydir
ADD hom?.txt /mydir #以hom开头.txt结尾的所有文件拷贝到容器中的/mydir

8、COPY
用法:COPY <源地址> <目标地址>
copy复制新文件到容器中去,并且添加到容器指定的路径中,用法和ADD相同,唯一不同的是不能指定远程配置文件URLS

9、ENTRYPOINT
用法:
ENTRYPOINT "executable","param1","param2"
ENTRYPOINT command param1 param2(shell form)
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖,而CMD是可以被覆盖的。如果覆盖则可以使用docker run --entrypoint选项
每个dockerfile中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效

Exec form ENTRYPOINT 例子:
通过 ENTRYPOINT使用exec form方式设置稳定的默认命令和选项,而使用CMD添加默认之外经常被改动的选项。
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

通过 Dockerfile 使用ENTRYPOINT展示前台运行 Apache 服务
FROM debian:stable
RUN yum update && yum install httpd -y
EXPOSE 80 443
VOLUME ["/var/www/html", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

shell form ENTRYPOINT 例子:
这种方式会在/bin/sh -c 中执行,会忽略任何CMD或者docker run命令选项,为了确保docker stop能够停止长时间运行ENTRYPOINT的容器,确保执行的时间使用exec选项

10、VOLUME
用法:VOLUME ["/data"]
创建一个可以从本地主机或其他容器的挂载点

11、USER
使用哪个用户跑container
例:
ENTRYPOINT ["memcached"]
USER daemon

12、WORKDIR
相当于CD命令

13、ONBUILD
ONBUILD 指令的命令在构建镜像时不执行,而是在他的子镜像中执行