Dockerfile文件制作几点摘录

指令说明

指令说明及备注

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:v2docker run -it --volumes-from data-container  /bin/bash

Dockerfile编写注意点

1.精简镜像用途:尽量让每个镜像的用途都较集中、单一,避免构造大而复杂、多功能镜像;
2.选用合适的基础镜像:过大的基础镜像会造成构建出臃肿的镜像,一般推荐比较小巧的镜像作为基础镜像;
3.提供详细的注释和维护者信息:Dockerfile也是种代码,需要考虑方便后续扩展和他人的使用;
4.正确使用版本号:使用明确的具体数字信息的版本号信息,而非latest,可以避免无法确认具体版本号,统一环境;
5.减少镜像层数:建议尽量合并RUN指令,将多条RUN指令的内容通过&&连接;
6.及时删除临时和缓存文件:可以避免最后构造的镜像过于臃肿,并且这些缓存文件并没有实际用途;
7.提高生产速度:合理使用缓存、减少目录下的使用文件,使用.dockeringore文件等;
8.调整合理的指令顺序:在开启缓存的情况下,内容不变的指令尽量放在前面,这样可以提高指令的复用性;
9.减少外部源的干扰:如果确实要从外部引入数据,需要制定持久的地址,并带有版本信息,让他人可以重复使用而不出错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容