dockerfile常用的指令

dockerfile 是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节

使用docker 构建镜像

docker build -t "镜像名" “dockerfile路径”

例如 docker build -t nginx:my . ,其中最后的(.)用于路径参数传递,表示当前路径

ADD 复制文件

ADD 指令用于复制文件,格式为:ADD <src> ... <dest>

从src目录复制文件到容器的dest. 其中src可以是dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包

注意:

1 如果src 是一个URL,同时dest不以斜杠结尾,dest将会被视为文件,src对应内容文件将会被下载到dest

2 如果src 是一个URL,同时dest以斜杠结尾,dest将被视为目录,src对应内容将会被下载到dest目录

3 如果src 是一个目录,那么整个目录下的内容将会被复制,包括文件系统元数据

4 若果文件是可识别的压缩包格式,则docker会自动解压

例如 ADD hello.jar app.jar

ARG 设置构建参数

ARG 指令用于设置构建参数,类似于ENV。和ARG不同的是,ARG设置的是构建时的环境变量,在容器运行时是不会存在这些变量的

例如 ARG user1=shendu

CMD容器启动命令

CMD ["executable","param1","param2"]

CMD ["param1","param2"]

CMD command param1 param2

CMD 是用来设定镜像默认执行命令的命令。推荐用法是 CMD ["executable","param1","param2"],当使用这种用法时,其设定的命令将作为容器启动时的默认执行命令,例如

CMD ["x11vnc","-forever","-usepw","-create"] 是容器启动时 开启 x11vnc远程桌面的服务

当使用第二种用法时,其中的param将作为ENTERPOINT的默认参数使用

第三种用法 ,例如 CMD echo "this is a test." | wc -c 将后面命令作为shell命令,依靠/bin/sh -C来执行

在一个dockerfile 中可以同时出现多次CMD指令,可只有最后一次CMD命令会生效。同时在CMD中也只能出现双引号,不能使用单引号。

COPY 复制文件

COPY <src> <dest>

复制本地端的src到容器的dest. COPY 指令和ADD 指令类似,COPY不支持URL和压缩包

ENTRYPOINT 命令

ENTRYPOINT ["executable","param1","param2"]

ENTRYPOINT command param1 param2

ENTRYPOINT是用来设定容器运行时默认执行程序的命令。第一种用法时docker官方推荐的用法。通过第一种用法,读者可以自行设定需要执行的二进制程序和参数。

而第二种方法则将所设定的二进制程序限制在/bin/sh -C下执行

CMD 和 ENTRYPOINT 的区别

CMD 指令指定的容器启动时命令可以被docker run 指令的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run 指定的参数当做ENTRYPOINT 指定命令的参数

例如 CMD ["/opt/startup"]

当容器启动命令是 docker run -ti --rm=true test /bin/bash -c 'echo Hello' ,docker run 命令启动容器时指定的运行命令覆盖了dockerfile 文件中CMD指令指定的命令

CMD 指令可以为ENTRYPOINT 指令设置默认参数,而且可以被docker run指定的参数覆盖

例如

ENTRYPOINT ["/opt/startup", "arg1"]

CMD ["arg2"]



docker run -ti --rm=true test

in startup, args: arg1 arg2



docker run -ti --rm=true test arg3

in startup, args: arg1 arg3

从上面第一个容器运行的结果可以看出CMD 指令为 ENTRYPOINT 指令设置了默认参数;从第二个容器的运行结果看出,docker run 命令指定的参数覆盖了CMD 指令指定的参数

如果Dockerfile指定的基础镜像中是ENTRYPOINT指定的启动命令,则该Dockerfile中的CMD依然是为基础镜像中的ENTRYPOINT设置默认参数

ENV 设置环境变量

ENV 指令用于设置环境变量 格式为:

ENV <key> <value>

ENV <key>=<value>

例如 ENV JAVA_HOME /path/to/java

EXPOSE声明暴露的端口

EXPOSE 指令用于声明在运行时容器提供服务的端口,格式为:EXPORT <port> [<port>....]

需要注意的是,这只是一个声明,运行时并不会因为该声明就打开相应端口。该指令的作用主要是帮助镜像使用者理解该镜像服务的守护端口;其次是当运行时使用随机映射时,会自动映射EXPOSE的端口

例如:

声明暴露一个端口示例

EXPOSE port1

相应的运行容器使用的命令

docker run -p port1 image

也可使用-P选项启动

docker run -P image

声明暴露多个端口示例

EXPOSE port1 port2 port3

相应的运行容器使用的命令

docker run -p port1 -p port2 -p port3 image

也可以指定需要映射到宿主机器上的端口号

docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image

FROM 指定基础镜像

格式

FROM <image>

FROM <image>:<tag>

FROM <image>@<digest>

FROM 是dockerfile 内置命令中唯一一个必填项,其有上述三种用法。FROM用来指定后续指令执行的基础镜像,所以在一个有效的dockerfile中,FROM永远是第一个命令

FROM 指定的基础镜像既可以是本地已经存在的镜像,也可以是远程仓库中的镜像。当dockerfile执行时,如果本地没有其指定的基础镜像,那么就会从远程仓库中下载此镜像

在FROM用法中,tag和digest属于可选项,如果没有则默认取指定镜像的最新版,也就是latest版本。如果找不到latest版本,那么整个dockerfile 就会报错返回

LABEL 为镜像添加元数据

LABEL 指令用于为镜像添加元数据

格式为:LABEL <key>=<value> <key>=<value> <key>=<value> 。。。

例如

LABEL version="1.0"

MAINTAINER 指定维护者的信息

MAINTAINER 指令用于指定维护者的信息,用于为dockerfile 署名

格式为 : MAINTAINER <name>

示例:

MAINTAINER shendu<[email protected]>

RUN 命令

格式:

RUN <command>

RUN ["executable","param1","param2"]

RUN命令是用来在镜像中执行命令的命令,是一个完整dockerfile中使用频率最高的命令,其有上面两种用法,最基本的用法就是RUN <command>

当使用RUN <command>用法时,后面的命令其实是 由/bin/sh -C 来负责执行的。所以RUN的这种用法就会存在一个限制,那就是在镜像中必须要有/bin/sh

如果基础镜像没有/bin/sh,那么就需要使用RUN 的另外一个用法了。RUN ["executable","param1","param2"],可以执行基础镜像中任意一个二进制程序。比如我们需要使用bash来执行程序,就可以这样编写RUN指令:

RUN ["/bin/bash","-c","echo hello"]

在使用这种用法时,[]中的数据都会被安装JSON字符串的格式进行解析,因此只能使用双引号"",不能使用单引号或其他符号

USER设置用户

该指令用于设置启动镜像时的用户或者UID,写在该指令后的RUN,CMD以及ENTRYPOINT指令都将使用该用户执行命令

格式为:USER 用户名

例子:USER shendu

VOLUME 指定挂载点

该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在dockerfile中使用该指令

格式为 : VOLUME ["/data"]

示例

VOLUME /data

WORKDIR 指定工作目录

格式为:WORKDIR /path/to/workdir

切换目录指令,类似于cd命令,写在该指令后的RUN,CMD以及ENTRYPOINT 指令都将该目录作为当前目录,并执行相应的命令

参考资料

springcloud 与docker 微服务架构实战

docker全攻略

猜你喜欢

转载自blog.csdn.net/weixin_39639119/article/details/82818020