本文来自技术分享node
格式:python
shell 格式:COPY <源路径> ... <目标路径> nginx
exec 格式:COPY [" <源路径1> ",... " <目标路径> "] git
说明:github
两种格式,一种相似于命令行,一种相似于函数调用。web
COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。 redis
示例:docker
COPY package.json /usr/src/app/shell
<源路径> 能够是多个,甚至能够是通配符,其通配符规则要知足 Go 的 filepath.Match 规则,如: 数据库
COPY hom* /mydir/ COPY hom?.txt /mydir/
格式:
ADD <源路径> ... <目标路径>
ADD [" <源路径1> ",... " <目标路径> "]
说明:
ADD 指令和 COPY 的格式和性质基本一致。可是在COPY 基础上增长了一些功能。
<源路径> 能够是一个 URL ,这种状况下,Docker引擎会试图去下载这个连接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600 ,若是这并非想要的权限,那么还须要增长额外的一层 RUN 进行权限调整,另外,若是下载的是个压缩包,须要解压缩,也同样还须要额外的一层 RUN 指令进行解压缩。不推荐使用。
若是 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip , bzip2 以及 xz 的状况下, ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
示例:
ADD mqtt-service.sh $MQTT_SERVICE/
格式:
CMD 指令的格式和 RUN 类似,也是两种格式:
l shell 格式: CMD <命令>
l exec 格式: CMD ["可执行文件", "参数1", "参数2"...]
l 参数列表格式: CMD ["参数1", "参数2"...] 。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数
说明:
Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,须要指定所运行的程序及参数。 CMD 指令就是用于指定默认的容器主进程的启动命令的。
在运行时能够指定新的命令来替代镜像设置中的这个默认命令,好比, ubuntu 镜像默认的CMD 是 /bin/bash ,若是咱们直接 docker run -it ubuntu 的话,会直接进入 bash 。咱们也能够在运行时指定运行别的命令,如 docker run -it ubuntu cat /etc/os-release 。这就是用 cat /etc/os-release 命令替换了默认的 /bin/bash 命令了,输出了系统版本信息。在指令格式上,通常推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,所以必定要使用双引号 " ,而不要使用单引号。
若是使用 shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。好比:
CMD echo $HOME
在实际执行中,会将其变动为:
CMD [ "sh", "-c", "echo $HOME" ]
格式:
l shell 格式: ENTRYPOINT <命令>
l exec 格式: ENTRYPOINT ["可执行文件", "参数1", "参数2"...]
说明:
ENTRYPOINT 的格式和 RUN 指令格式同样,分为 exec 格式和 shell 格式。
ENTRYPOINT的目的和CMD 同样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也能够替代,不过比 CMD 要略显繁琐,须要经过 docker run 的参数 --entrypoint 来指定。
当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变,再也不是直接的运行其命令,而是将CMD 的内容做为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:
示例:
ENTRYPOINT ["./mqtt-service.sh"]
格式:
ENV
ENV
说明:
这个指令很简单,就是设置环境变量而已,不管是后面的其它指令,如 RUN ,仍是运行时的应用,均可以直接使用这里定义的环境变量。
下列指令能够支持环境变量展开:
ADD 、 COPY 、 ENV 、 EXPOSE 、 LABEL 、 USER 、 WORKDIR 、 VOLUME 、 STOPSIGNAL 、 ONBUILD 。
格式:
ARG <参数名> [= <默认值> ]
说明:
构建参数和 ENV 的效果同样,都是设置环境变量。所不一样的是, ARG 所设置的构建环境的环境变量,在未来容器运行时是不会存在这些环境变量的。
Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值能够在构建命令docker build 中用 --build-arg <参数名> = <值> 来覆盖。
格式:
VOLUME [" <路径1> ", " <路径2> "...]
VOLUME <路径>
说明:
容器运行时应该尽可能保持容器存储层不发生写操做,对于数据库类须要保存动态数据的应用,其数据库文件应该保存于卷(volume)中。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在Dockerfile 中,咱们能够事先指定某些目录挂载为匿名卷,这样在运行时若是用户不指定挂载,其应用也能够正常运行,不会向容器存储层写入大量数据。
VOLUME /data
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。固然,运行时能够覆盖这个挂载设置。好比:
docker run -d -v mydata:/data xxxx
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了Dockerfile 中定义的匿名卷的挂载配置。
格式:
EXPOSE <端口1> [ <端口2> ...]
说明:
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会由于这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另外一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
示例:
EXPOSE 8080/tcp
格式:
WORKDIR <工做目录路径>
说明:
使用 WORKDIR 指令能够来指定工做目录( 或者称为当前目录) ,之后各层的当前目录就被改成指定的目录,如该目录不存在, WORKDIR 会帮你创建目录。
示例:
WORKDIR ${MQTT_SERVICE}
格式:
USER <用户名>
说明:
USER 指令和 WORKDIR 类似,都是改变环境状态并影响之后的层。 WORKDIR 是改变工做目录, USER 则是改变以后层的执行 RUN , CMD 以及 ENTRYPOINT 这类命令的身份。
若是以 root 执行的脚本,在执行期间但愿改变身份,好比但愿以某个已经创建好的用户来运行某个服务进程,不要使用 su 或者 sudo ,这些都须要比较麻烦的配置,并且在 TTY 缺失的环境下常常出错。建议使用 gosu 。
# 创建 redis 用户,并使用 gosu 换另外一个用户执行命令 RUN groupadd -r redis && useradd -r -g redis redis # 下载 gosu RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-amd64" \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true # 设置 CMD,并以另外的用户执行 CMD [ "exec", "gosu", "redis", "redis-server" ]
格式:
HEALTHCHECK [选项] CMD <命令> :设置检查容器健康情况的命令
HEALTHCHECK NONE :若是基础镜像有健康检查指令,使用这行能够屏蔽掉其健康检查指令
说明:
HEALTHCHECK 指令是告诉 Docker 应该如何进行判断容器的状态是否正常,这是 Docker 1.12引入的新指令。
HEALTHCHECK 支持下列选项:
--interval= <间隔> :两次健康检查的间隔,默认为 30 秒;
--timeout= <时长> :健康检查命令运行超时时间,若是超过这个时间,本次健康检查就被 视为失败,默认 30 秒;
--retries= <次数> :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3次。
示例:
FROM nginx RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* HEALTHCHECK --interval=5s --timeout=3s CMD curl -fs http://localhost/ || exit 1
健康检查命令的输出( 包括 stdout 以及 stderr ) 都会被存储于健康状态里,能够用 docker inspect 来查看
$ docker inspect --format '{{json .State.Health}}' web | python -m json.tool
格式:
ONBUILD <其它指令>
说明:
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,好比 RUN , COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
示例:
FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ]
构建镜像my-node
FROM my-node
这个镜像构建时会执行以上ONBUILD中的三个命令。