使用环境变量的方式
$varname
${varname}
${varname:-default value} # 设置一个默认值,如果varname未被设置,值为默认值
${varname:+default value} # 设置默认值;不管值存不存在都使用默认值
#### USER:设置启动容器的用户
使用用户名
USER testuser
使用用户的UID
USER UID
#### RUN:镜像构建时执行的命令
语法1,shell 形式
RUN command1 && command2
语法2,exec 形式
RUN [“executable”,“param1”,“[aram2]”]
示例
RUN echo 1 && echo 2
RUN echo 1 && echo 2
echo 3 && echo 4
RUN [“/bin/bash”,“-c”,“echo hello world”]
RUN 在下一次建构期间,会优先查找本地缓存,若不想使用缓存可以通过–no-cache解除
docker build --no-cache
RUN 指令指定的命令是否可以执行取决于 基础镜像
shell形式
默认使用/bin/sh -c 执行后面的command
可以使用 && 或 \ 连接多个命令
exec形式
exec形式被解析为JSON序列,这意味着必须使用双引号 “”
与 shell 形式不同,exec 形式不会调用shell解析。但exec形式可以运行在不包含shell命令的基础镜像中
例如:RUN [“echo”,“$HOME”] ;这样的指令 $HOME并不会被解析,必须RUN [“/bin/sh”,“-c”,“echo $HOME”]
#### EXPOSE:为容器打开指定的监听端口以实现与外部通信
EXPOSE /
EXPOSE 80
EXPOSE 80/http
EXPOSE 2379/tcp
:端口号
:协议类型,默认TCP协议,tcp/udp/http/https
并不会直接暴露出去,docker run时还需要-P指定才可以,这里更像是一个说明
#### VOLUME:实现挂载功能,将宿主机目录挂载到容器中
VOLUME [“/data”] # [“/data”]可以是一个JsonArray ,也可以是多个值
VOLUME /var/log
VOLUME /var/log /opt
三种写法都是正确的
VOLUME类似于docker run -v /host_data /container_data 。
一般不需要在Dockerfile中写明,且在Kubernetes场景几乎没用
#### CMD:为容器设置默认启动命令或参数
语法1,shell形式
CMD command param1 param2 …
语法2,exec形式
CMD [“executable”,“param1”,“param2”]
语法3,还是exec形式,不过仅设置参数
CMD [“param1”,“param2”]
CMD运行结束后容器将终止,CMD可以被docker run后面的命令覆盖
一个Dockerfile只有顺序向下的最后一个CMD生效
语法1,shell形式,默认/bin/sh -c
此时运行为shell的子进程,