指令说明
指令说明及备注
FROM
功能:指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像;任何Dockerfile中的第一条指令必须为FROM指令。如果在同一个Dockerfile文件中创建多个镜像,可以使用多个FROM指令(每个镜像一次)
用法:FROM<image>,或FROM<image>:<tag>,或FROM<image>@<digest>
MAINTAINER
功能:指定维护者信息,示例:MAINTAINER "docker-maint@nginx.com"
备注:该信息将会写入生成镜像的Author属性域中
RUN
功能:容器种运行命令;
用法:RUN<command>或RUN ["executable","param1","param2"] 前者使用默认的shell终端/bin/sh -c;后者使用exec,后者由于指令会被解析成json数组,需使用双引号,示例:RUN ["/bin/bash","-c","echo hello"]
备注:每条RUN指令在当前镜像的基础上执行指定命令并提交为新镜像
CMD
功能:指定启动容器时默认执行的命令;支持三种格式:
CMD ["executable","param1","param2"] 用exec执行,是推荐使用的方式;
CMD param1 param2 用/bin/sh执行,适合交互应用;
CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数。
备注:每个Dockerfile只有一条CMD命令执行。多条命令的只执行最后一条;如果启动容器时指定了运行命令(作为run的参数),则会覆盖掉CMD指定的命令
LABEL
功能:指定生成镜像的元数据标签信息;
用法:LABEL <key>=<value> <key>=<value> <key>=<value> ...
EXPOSE
功能:声明镜像内服务所监听的端口;
用法:EXPOSE <port> [<port>...] 该命令只是声明不会自动完成端口映射。需要在容器启动时使用-P(大写P),Docker主机会自动分配一个宿主机未被使用的临时端口转发到指定的端口;使用-p(小写p),则可具体指定哪个宿主机的本地端口映射过来该容器运行时暴露出去的端口,结合-p指定宿主机与容器的端口映射进行外网访问
ENV
功能:指定环境变量,类似export中的环境变量
用法:ENV <key> <value>或ENV<key>=<value>...
示例:ENV JAVA_HOME XXXXXX
ADD
功能:复制指定<src>路径下的内容到容器中的<dest>路径下;
用法:ADD <src> <dest> 其中 <src>可以为URL或相对路径、文件;如果为tar文件,会自动解压到<dest>路径下(dest是容器内绝对路径或者相当于工作目录(WORKDIR)的相对路径。路径支持正则表达式)如果src指定绝对路径,会出现COPY failed: stat /home/docker/tmp/docker-builderXXX/XXXX/my.cnf: no such file or directory
COPY
功能:复制本地主机<scr>路径下的内容到容器中的<dest>路径下;
用法:COPY <src> <dest> 其中src为Dockerfile所在目录的一个相对路径、文件或目录,目标路径不存在时会自动创建,同样支持正则;一般情况下推荐用COPY非ADD
ENTRYPOINT
功能:指定镜像的默认入口命令,容器启动时作为根命令执行,所有传入值为该命令的参数;
支持2种格式的命令:
ENTRYPOINT["executable","param1","param2"] (exec调用执行);
ENTRYPOINT command param1 param2(shell中执行)
CMD指令携带的数据将作为根命令ENTRYPOINT的参数。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时最后一个有效。在运行时可以被--entrypoint参数覆盖掉,如docker run --entrypoin
VOLUME
功能:创建数据挂载点;
用法:VOLUME ["/data"];可从本地主机或者其他容器挂载数据卷,用来存放数据等用于保存容器运行过程中产生的数据(如果不指定卷:容器终止后中间数据及文件自动消失)
USER
功能:指定运行容器时的用户名或UID,后续的RUN等指令也会使用特定用户身份;
用法:USER daemon
要临时获取管理员权限可用gosu或者sudo;当服务不需管理员权限时,可通过该指令指定运行用户,且可在之前创建所需要用户。如:RUN groupadd -r nginx && useradd -r -g nginx nginx
WORKDIR
功能:配置工作目录
用法:WORKDIR /path;可以使用多个WORKDIR指令,后续命令如果参数是相对的,则会基于之前命令指定的路径。示例:WORKDIR /a WORKDIR b WORKDIR c 最终的WORKDIR为/a/b/c
ARG
功能:指定镜像内使用的参数(例如版本号信息等);
用法:ARG<name>[=<default value>];可以用docker build --build-arg<name>=<value>来指定参数值
ONBUILD
功能:配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令
STOPSIGNAL容器退出信号 ; 如:STOPSIGNAL singnal;HEALTHCHECK如何进行健康检查;Docker1.12后开始的功能;有如下两种格式:HEALTHCHECK [OPTIONS] CMD command :根据所执行命令返回值是否为0判断;HEALTHCHECK NONE :禁止基础镜像中的健康检查。OPTIONS提供如下可选方式:
--inerval=DURATION (默认为:30s):多久检查一次;
--timeout=DURATION (默认为:30s):每次检查等待结果的超时时间;
--retries=N (默认为:3):如果失败了,重试几次才最终确定失败。
SHELL指定使用SHELL时默认类型SHELL ["executable","parameters"];默认为["bin/sh","-c"]
镜像构建
编辑好Dockerfile,同时准备好镜像构建中使用的相关文件后,通过执行如下命令:
docker build -t 标签信息 Dockerfile所在路径
命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像。因此除非生成镜像需要,否则一般建议放置Dockerfile的目录为空目录。
.dockeringore文件忽略部分文件
可以通过.dockeringore文件(每一行添加一条匹配模式)来让Docker忽略匹配模式路径下的目录和文件;.dockeringore文件示例:
# comment
*/tmp*
*/*/tmp*
tmp?
~*
具体示例
docker build -t ct_repo/mysql5.7 /home/win/configure/
编码、权限问题注意
很多时候在容器里面运行初始化脚本时,可能会遇到如下错误信息
错误信息: No such file or directory:
解决方案:先确认下初始化脚本的文件格式,通过set ff 如果为dos 需要修改为unix,再运行;
错误信息:Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open
解决方案:只需把相关权限调小
创建数据卷容器
docker create -v $PWD/vol/data --name data-container es-sql:v2
docker run -it --volumes-from data-container /bin/bash
Dockerfile编写注意点
1.精简镜像用途:尽量让每个镜像的用途都较集中、单一,避免构造大而复杂、多功能镜像;
2.选用合适的基础镜像:过大的基础镜像会造成构建出臃肿的镜像,一般推荐比较小巧的镜像作为基础镜像;
3.提供详细的注释和维护者信息:Dockerfile也是种代码,需要考虑方便后续扩展和他人的使用;
4.正确使用版本号:使用明确的具体数字信息的版本号信息,而非latest,可以避免无法确认具体版本号,统一环境;
5.减少镜像层数:建议尽量合并RUN指令,将多条RUN指令的内容通过&&连接;
6.及时删除临时和缓存文件:可以避免最后构造的镜像过于臃肿,并且这些缓存文件并没有实际用途;
7.提高生产速度:合理使用缓存、减少目录下的使用文件,使用.dockeringore文件等;
8.调整合理的指令顺序:在开启缓存的情况下,内容不变的指令尽量放在前面,这样可以提高指令的复用性;
9.减少外部源的干扰:如果确实要从外部引入数据,需要制定持久的地址,并带有版本信息,让他人可以重复使用而不出错。
网友评论