本文为Dockerfile的语法简单介绍
使用Dockerfile构建镜像比docker commit的优势 :
1、首先dockerfile是一个文本文件,可控性好,后面要进行翻看或check时更加简单。
2、在使用CI/CD等devops工具时,我们一般都是将写好的Dockerfile push到gitlab中去,然后Jenkins监测到对应的project有变动,然后执行自动构建,基于Dockerfile去构建
docker image,然后去部署到kubernetes集群中。
Dockerfile常用指令
FROM #指定base镜像
MAINTAINER #设置镜像作者
COPY #将文件从host上的build context拷贝到镜像目录,注意src文件必须是build context内的 支持的格式COPY src dest 和COPY [“src”,”dest”]
ADD #与copy类似,从build context复制文件到镜像,不同的是如果src是归档类文件(tar,zip,tgz,xz等),文件会自动解压到dest
ENV #设置环境变量,环境变量可被后面的指令使用。
EXPOSE#指定容器中进程会监听的端口,Docker可以将端口暴露出来。
VOLUME #将文件或目录声明为volume
WORKDIR #build时会直接切换到此目录,为后面的RUN、CMD、ENTRYPOINT、ADD、COPY等指令设置镜像当前工作目录
RUN #容器中运行指定的命令
CMD #容器启动是运行指定的命令,可以由多个CMD命令,但只有最后一个会生效,CMD命令会被docker run之后根的参数替换掉。
ENTRYPOINT #设置容器启动时命令,Dockerfile中有多个ENTRYPOINT命令但只有最后一个生效,cmd或docker run之后的参数会被当做参数传递给ENTRYPOINT。
指令有两中格式shell和exec格式
shell格式
如
RUN apt get install python3
CMD echo “Hello world”
exec格式
如
RUN [“apt-get”, “install”,”python3”]
CMD[“/bin/echo”, “hello world”]
exec执行指令时,会直接调用[command]命令,不会被shell解析,
当有环境变量时使用exec格式不会被解析。
如
ENV name wan ENTRYPOINT [“/bin/echo”,”hello”,$name”]
运行容器将输出
hello $name
如果要输出变量
ENV name wan ENTRYPOINT [“/bin/sh”,”-c”,”echo hello,$name”]
运行容器将输出
hello ,wan
cmd和entrypoint的区别
如果docker run指定了其他命令,cmd指定的默认命令将被忽略,当entrypoint一定会执行。并将docker run后面的参数做为entrypoint后面的参数。
cmd可以做entrypoint的参数
ENTRYPOINT [“/bin/echo”,”hello”]
CMD [“world”]
当容器通过docker run -it [image]启动时输出
hello world
entrypoint使用shell格式是,会忽略cmd或docker run提供的参数。