dockerfile文件语法命令


dockerfile文件语法命令

(1) FROM命令,支持两种形式,构建新镜像使用的基础镜像,所以源镜像必须存在,并且是非注释的第一条命令。

DOCKERFILEFORM <image>
FORM <image>:<tag>

# 示例: FROM nginx 

 

(2) LABEL和MAINTAINER命令,MAINTAINER用来指定构建镜像的作者信息,新版本docker已经摒弃,使用LABEL可以实现,LABEL保存key=value键值对元数据。

DOCKERFILE# 示例: # MAINTAINER "vison vison@126.com" LABEL maintainer="vison vison@126.com" 

 

(3) RUN命令,指定镜像中运行的命令,包含两种模式。

DOCKERFILE# shell模式,相当于命令行的/bin/bash -c command RUN <COMMAND> # 示例: RUN echo "hello world" # exec模式,可以指定其他的shell执行指令 RUN ["executable" "param"...] # 示例: RUN ["/bin" "-c" "echo 'hello world'"] 

 

(4) EXPOSE命令,用来指定运行该镜像使用的端口,可以指定多个端口,但不一定暴露,在docker run中指定参数-P,不需要指定端口,端口就暴露公开了。

EXPOSE <PORT> [<PORT>...] # 注:虽然在dockerfile里指定了端口,只是告诉docker里的程序会使用该端口,但在运行时docker并不会自动打开该端口,还是需要指定端口映射,例如docker run -d -P ... 

 

(5) CMD和ENTRYPOINT命令,指定容器运行时的默认行为,和RUN命令类似,RUN命令是在镜像构建时执行,而CMD和ENTRYPOINT命令是在容器启动执行。

CMD和ENTRYPOINT相同点:只能写一条,如果写了多条,那么只有最后一条生效,都是在容器启动时执行。

不同点:使用docker run启动容器指定执行命令,CMD命令会被覆盖(不执行),ENTRYPOINT命令不会被覆盖,如果想要覆盖,在docker run加上参数–entrypoint。

CMD和ENTRYPOINT命令格式:

BASHCMD ["executable","param1","param2"] (exec form, this is the preferred form) CMD ["param1","param2"] (as default parameters to ENTRYPOINT) CMD command param1 param2 (shell form) ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred) ENTRYPOINT command param1 param2 (shell form) 

示例:

DOCKERFILE# 只有CMD命令情况 CMD echo "hello world" # 只有ENTRYPOINT命令情况 ENTRYPOINT ["echo", "hello world"] # CMD和ENTRYPOINT都存在情况,CMD作为ENTRYPOINT的参数使用 CMD ["hello world"] ENTRYPOINT ["echo"] 

一般使用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认参数,也就是run里面没有任何参数时使用的默认参数。

 

(6) COPY和ADD命令,将目录或文件复制镜像中,两者区别是ADD包含了类似tar的解压缩功能,如果只是目录或文件复制,推荐使用COPY。复制目录时需要’/‘结尾,目录不存在会自动创建。

DOCKERFILECOPY <src> <dest> ADD <src> <dest> # src表示来源地址,可以是本地或网络地址,如果是本地地址,必须是镜像的相对地址(dockerfile为参考路劲)。 # dest表示将文件复制到镜像目标地址,必须是绝对路径。 # 示例: COPY nginx-1.15.2.tag.gz /data/ # 单纯复制文件 ADD nginx-1.15.2.tag.gz /data/ # 解压复制文件夹 

 

(7) VOLUME命令,在镜像中创建挂载点,只要通过该镜像创建的容器都有了挂载点。

DOCKERFILEVOLUME ["/data1","/data2"] # 这种方式没有指定宿主机映射,如果使用VOLUME命令构建的新镜像,以该镜像运行2个容器,这两个容器是不能共享数据的,通过执行docker inspect命令得到结果就可以看出映射到宿主机目录完全不一样的,所以两个容器的数据卷不能共享。 

Volumes and Dockerfiles Don’t Mix

 

(8) WORKDIR命令,指定工作目录,CMD或ENTRYPOINT执行的命令都会在WORKDIR目录下执行。

DOCKERFILEWORKDIR <PATH> # 示例: WORKDIR /a WORKDIR b WORKDIR c # 最后的工作目录是/a/b/c 

WORKDIR通常不使用绝对路劲,使用相对路劲可以一直传递下去。

 

(9) ENV命令,构建镜像过程和容器运行过程都有效。

DOCKERFILEENV <KEY> <VALUE> ENV <KEY>=<VALUE> ... # 示例: ENV hw='hello world' 

 

(10) USER命令,容器启动时以什么用户运行,默认使用root用户。

DOCKERFILEUSER user USER user:gid USER user:group USER uid USER uid:gid USER uid:group 

 

(11) ONBUILD命令,镜像触发器,当一个镜像被其它镜像作为基础镜像时执行,会在构建过程中插入指令。

DOCKERFILEONBUILD <INSTRUCTION> # 示例: ONBUILD COPY copyFile/config /data #在构建基础镜像的dockerfile添加下面命令,实际构建的时候不会执行COPY命令,当构建另一个新镜像并且以该镜像为基础镜像时,会执行COPY命令。 

 

扩展:

docker学习笔记


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM