LABLE 给镜像添加元数据信息
COPY 用户从宿主机的当前目录复制文件至创建的新映像文件
- COPY <src> <dest>
- COPY ["<src>",..."<dest>"]
- <src > 为要复制的源文件或目录, 支持使用通配符
- <dest > 为目标路径, 建议使用绝对路径
- <src > 必须是 build 上下文中的路径, 不能是其父目录中的文件
如果 < src > 是目录, 则其内部文件或子目录会被递归复制, 但是 < src > 目录本身不会被复制
ADD 类似于 COPY 指令, ADD 支持使用 tar 文件和 URL 路径
操作如 COPY
如果 < src > 是一个本地系统上压缩格式的 tar 文件, 它降被展开为一个目录, 其行为类似 "tar -x" 命令, 通过 url 获取到的 tar 文件将不会自动展开;
WORKDIR 用于为 Dockerfile 中所有的 RUN,CMD,ENTRYPOINT,COPY 和 ADD 指定工作目录
- WORKDIR /usr/local/
- ADD nginx-1.15.2.tar.gz ./src/
- VOLUME
定义存储卷, 只能制定容器内部的目录
EXPOSE 用户为容器打开制定要监听的端口以实现与外部通信
- EXPOSE <port>
- EXPOSE 11211/udp 11211/tcp
只有 docker run 加 -P 选项时才会将端口暴漏出来, 如果不加, 将不暴漏端口
ENV 用于为镜像定义所需的环境变量, 并可被 Dockerfile 文件中位于其后的其他指令 (如 ENV,ADD,COPY 等) 所调用, 调用格式为 $variable 或 ${variable}
ENV <key> <value > 或
ENV <key>=<value> ...
第二种格式可以设置多个变量, 若 < value > 中包含空格, 可以使用反斜线转义, 也可通过对 < value > 加引号来标识, 反斜线也可以用于续行
定义多个变量时, 建议使用第二种方式, 以便在同一层中完成所有功能.
如果在命令行中定义 - e 更改环境变量, 也只是更改了环境变量, 之前编译时候做的改变是更改不了的.
- [root@cv0002 docker]# docker run --name t1 --rm tinyhttpd:v0.0.7 printenv
- PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- HOSTNAME=a2c3f68db164
- DOC_ROOT=/data/Web/HTML/
- WEB_SERVER_PACKAGE=nginx-1.15.2
- HOME=/root
- [root@cv0002 docker]# docker run --name t1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.0.7 printenv
- PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- HOSTNAME=27213da32d60
- WEB_SERVER_PACKAGE=nginx-1.15.1
- DOC_ROOT=/data/Web/HTML/
- HOME=/root
- [root@cv0002 docker]# docker run --name t1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.0.7 ls /usr/local/src
- nginx-1.15.2
RUN 和 CMD 如图所示
image
RUN 在 docker build 中运行, 构建镜像时为了使镜像完整使用的命令. 在初始化容器时候时不可能再运行.
CMD 定义一个镜像文件启动为容器时候默认要运行的程序, 且其运行结束后, 容器也将终止, 而 docker 容器默认只运行一个程序. CMD 指令可以被 docker run 的命令行所覆盖
注意: RUN 命令在 Dockerfile 中可以有多个, 且可以都生效, 但是 CMD 有多个的话, 但只有最后一个生效
RUN 命令格式
- RUN <command>
- RUN ["<executable>","<param1>","<param2>"]
第一种格式,<command > 通常是一个 shell 命令, 且以 "/bin/sh -c" 来运行它, 这意味着此进程在容器中的 PID 不为 1, 不能接收 unix 信号(因为接收信号的都是进程为 1 的来接收), 因此, 当使用 docker stop <container > 命令停止容器时, 此京城接收不到 sigterm 信号;
第二种语法格式中的参数是一个 JSON 格式的数组, 其中 < executable > 为要运行的命令, 后面为参数. 然而, 此格式的命令不会以 "/bin/sh -c" 来发起, 因此不支持通配符等 shell 特性
注意: JSON 数组中, 要使用双引号
CMD 命令格式
- CMD <command>
- CMD ["<executable>","<param1>","<para
前两种语法格式的意义同 RUN
第三种则用于为 ENTRYPOINT 指令提供默认参数
ENTRYPOINT
类似 CMD 指令的功能, 用于为容器指定默认运行程序, 从而使得容器像是一个单独的可执行程序
与 CMD 不同的是, 有 ENTRYPOINT 启动的程序不会被 docker run 命令行制定的参数所覆盖, 而且, 这些命令行参数会被当做参数传递给 ENTRYPOINT 制定的程序, 但会被 docker run 命令的 --entryporint 选项的参数可覆盖 ENTRYPOINT 指令制定的程序
- ENTRYPOINT <command>
- ENTRYPOINT [<"<executable>","<param1>","<param2>">]
注意: docker run 传入的命令参数会覆盖 CMD 指令的内容并且附加到 ENTRYPOINT 命令最后作为其参数使用
注意: Dockerfile 文件中也可以存在多个 ENTRYPOINT 指令, 但仅有最后一个会生效
USER 用于指定运行的 image 时的或运行 Dockerfile 中的任何 RUN,CMD, 或 ENTRYPOINT 指令指定的程序时的用户名或 UID, 默认为 root 用户
USER <UID>|<username>
注意:<UID > 可以为任意数字, 但是事件中必须为 / etc/passwd 中某用户的有效 UID, 否则 docker run 命令将运行失败
HEALTHCHECK 检测应用是否正常运行
- HEALTHCHECK --start-period=3s CMD wget -O - -q http://${
- IP:-0.0.0.0
- }:${
- PORT:-80
- }/
- #3s 后开始检查, 需要等容器里面的操作全部运行完成再检查
SHELL 修改或额外定义运行程序的默认 shell
STOPSIGNAL 更好 docker stop 传过来的信号指令, 默认为 15
STOPSIGNAL signal
ARG 只再 build 中使用, 类似变量, 可以再 docker run 的时候通过 --build-tag 传值, 而 ENV 不可在 docker run 时传值.
ONBUILD 用于在 Dockerfile 中定义一个触发器(延时执行)
ONBUILD <指令>
当此 Dockerfile 被 build 为映像文件后, 此映像文件亦可作为 base image 被另一个 Dockerfile 用作 FROM 指令的参数, 并以之构建新的映像文件, 此时, ONBUILD 后的指令才会执行.
注意: 在 ONBUILD 指令中使用 ADD 或 COPY 指令应该格外小心, 因为新构建过程的上下文有可能会缺少源文件
来源: http://www.jianshu.com/p/b8bd143cd43d