Dockerfile再恋笔记 | 详解篇

前言
今晚整理整理dockerfile作为再恋笔记。
那谁没事安心后随笔整理,想想都心痛。


Dockerfile

​ Dockerfile是用于自定义构建Docker镜像的规则文件。编辑好了Dockerfile文件后,使用docker build即可构建一个镜像。构建一个怎样的镜像那就得看Dockerfile文件。我们来看看具体的Docker有哪些内容与规则。


基本结构

(1) 文件的编辑类似键值对,一个键配置一个值,规范而言,键为大写、值要小写

(2) 使用#注释

(3) 整体分为四个部分:镜像信息、作者信息、镜像构建指令信息、容器启动执行指令信息


指令说明

  • FROM from

    说明:指定构建的镜像基于哪个镜像,该指令必须位于Dockerfile的第一个指令,倘若不存在该镜像,那就默认从Docker hub拉下来。

    FROM <image>
    # or
    FROM <image><:tag>
    

    示例 :基于debain的jessie版本

    FROM debian:jessie
    
  • **MAINTAINER ** maintainer

    说明:描述构建者的信息等等。

    MAINTAINER <message>
    

    示例:作者AlicFeng 邮箱alic@samego.com

    MAINAINER AlicFeng <alic@samego.com>
    
  • **RUN ** run

    说明:构建镜像要执行的shell指令,默认通过/bin/sh解析器进行解析,也可以指定解析器。

    RUN <command>
    # or 
    RUN ["executable","param1","param2"]
    

    示例 1 :更新源并安装并安装make,注意安装时一定要使用-y,不然有时会出错

    RUN apt-get update \
      apt-get install make
    

    示例2:执行 ls -lshell指令,并指定/bin/bash解析器

    RUN ["/bin/bash","ls","-l"]
    
  • CMD cmd

    说明:构建的容器启动时要执行的指令。注意主注意注意、cmd指令只能包含一条,多的话只执行最后一条。

    CMD ["executable", "param1", "param2"]    #将会调用exec执行,首选方式
    # or
    CMD ["param1", "param2"]                  #当使用ENTRYPOINT指令时,为该指令传递默认参数
    # or
    CMD <command> ["param1","param2"]         #将会调用/bin/sh -c执行
    

    示例 1:容器启动时执行/root/start.sh脚本。

    CMD ["/root/start.sh"]
    

    示例 2:执行nginx -g daemon off

    CMD ["nginx", "-g", "daemon off"]
    
  • ENTRYPOINT entrypoint

    说明:entrypoint与cmd指令类似,entrypoint在dockerfile中只能出现一次,否则只执行最后一条。它是配置容器启动后执行的命令。

    ENTRYPOINT ["executable", "param1", "param2"]       #将会调用exec执行,首选方式
    # or
    ENTRYPOINT <command> ["param1","param2"]              #将会调用/bin/sh -c执行
    

    *示例 *:执行/etc/init.d/nginx restart命令

    ENTRYPOINT ["/etc/init.d/nginx","restart"]
    
  • EXPOSE expose

    说明:指定暴露的端口,供容器之间联系( -link )使用。

    EXPOSE <port> [.....]
    

    示例:暴露3306端口

    EXPOSE 3306
    
  • ENV env

    说明:指定环境变量,容器运行时也可以指定,这里起到定义的作用。

    ENV <key> <value>
    # or
    ENV <key>=<value>
    

    示例 1:设置一个IP环境变量为127.0.0.1。

    ENV IP=127.0.0.1
    

    示例 2:设置一个ngixn_dir环境变量为/app/server/nginx。

    ENV nginx_dir /app/server/nginx
    WORKDIR $nginx_dir
    
  • ADD add

    说明:拷贝文件,将src拷贝到dest目录下。注意:src支持文件或目录或远程URL,同时src为当前目录的相对目录,而dest是容器的绝对路径,默认拷贝后文件或目录的权限为0775,要是src为容器可识别的压缩文件,那么将会自动解压,这点要注意!

    ADD <src> <dest>
    

    示例 1:拷贝一个远程文件,该文件的URL为https://sise.samego.com/Linux/redis.tar.gz,注意,该文件为容器识别的文件,将会自动解压。

    ADD https://sise.samego.com/Linux/redis.tar.gz /app       #执行之后dest为/app/redis/...
    

    示例 2:将/root/bak/conf/redis.conf文件拷贝到/app/redis/目录下。

    ADD /root/bak/conf/redis.conf /app/redis/
    
  • COPY copy

    说明:copy与add类似,但是copy的功能比较简洁,没有add强大,不支持远程URL,但是src源文件为容器本地文件或目录的时候,推荐使用copy。

    COPY <src> <dest>
    

    示例:将/root/bak/conf/redis.conf文件拷贝到/app/redis/目录下。

    ADD /root/bak/conf/redis.conf /app/redis/
    

  • VOLUME volume

    说明:指定容器的挂载点,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。

    VOLUME ["path",...]
    

    示例 :挂载/data/mysql/data目录。

    VOLUME ["/data/mysql/data/"]
    
  • WORKDIR workdir

    说明:指定工作目录。有时执行RUN指令时需要切换目录,那就通过workdir指令进行切换。切换目录后在下一次切换之前都是在此目录下。可以是相对目录也可以是绝对路径。

    WORKDIR <path>
    

    示例:将工作目录切换至/app/nginx目录。

    WORKDIR /app/nginx
    
  • USER user

    说明:指定容器运行执行RUN、CMD指令时的用户,注意:在下一次切换用户之前将一直使用该用户。

    USER <username | uid>
    

    示例:切换用户为same。

    USER alic
    
  • ONBUILD onbuild

    说明:配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

    ONBUILD [INSTRUCTION]
    

    示例:比如有这样一个基础镜像same:basic,在构建same:latest时,在basic基础镜像中使用ONBUILD声明的ONBUILD RUN apt-get update指令,构建latest版本也将会自动执行。

    # 这是same:basic
    ONBUILD RUN apt-get update
    
    # 这是same:latest正在构建的镜像
    FROM same:basic
    # 构建时将自动执行基于basic镜像使用ONBUILD的指令 如下
    RUN apt-get update
    

    构建镜像示例

    说明:基于alpine:3.5构建一个Redis镜像。

    FROM alpine:3.5
    
    # 创建一个redis用户组并创建一个redis用户将其增加在redis用户组
    RUN addgroup -S redis && adduser -S -G redis redis
    
    # grab su-exec for easy step-down from root
    RUN apk add --no-cache 'su-exec>=0.2'
    
    # 定义环境变量
    ENV REDIS_VERSION 3.2.8
    ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.8.tar.gz
    ENV REDIS_DOWNLOAD_SHA1 6780d1abb66f33a97aad0edbe020403d0a15b67f
    
    # for redis-sentinel see: http://redis.io/topics/sentinel
    RUN set -ex \
      \
      && apk add --no-cache --virtual .build-deps \
          gcc \
          linux-headers \
          make \
          musl-dev \
          tar \
      \
      && wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \
      && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
      && mkdir -p /usr/src/redis \
      && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
      && rm redis.tar.gz \
      \
    # Disable Redis protected mode [1] as it is unnecessary in context
    # of Docker. Ports are not automatically exposed when running inside
    # Docker, but rather explicitely by specifying -p / -P.
    # [1] https://github.com/antirez/redis/commit/edd4d555df57dc84265fdfb4ef59a4678832f6da
      && grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 1$' /usr/src/redis/src/server.h \
      && sed -ri 's!^(#define CONFIG_DEFAULT_PROTECTED_MODE) 1$!\1 0!' /usr/src/redis/src/server.h \
      && grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 0$' /usr/src/redis/src/server.h \
    # for future reference, we modify this directly in the source instead of just supplying a default configuration flag because apparently "if you specify any argument to redis-server, [it assumes] you are going to specify everything"
    # see also https://github.com/docker-library/redis/issues/4#issuecomment-50780840
    # (more exactly, this makes sure the default behavior of "save on SIGTERM" stays functional by default)
      \
      && make -C /usr/src/redis \
      && make -C /usr/src/redis install \
      \
      && rm -r /usr/src/redis \
      \
      && apk del .build-deps
    
    # 还是RUN指令
    RUN mkdir /data && chown redis:redis /data
    
    # 指定挂载目录
    VOLUME /data
    
    # 切换当前的目录为/data
    WORKDIR /data
    
    # 拷贝文件
    COPY docker-entrypoint.sh /usr/local/bin/
    
    ENTRYPOINT ["docker-entrypoint.sh"]
    
    # 暴露6379端口
    EXPOSE 6379
    
    # 容器启动时执行redis-server命令
    CMD [ "redis-server" ]
    

    快要闭馆了,快速借助redis托管在github的一个Dockerfile作为简单的示例。

    Alic say :****价值源于技术,贡献源于分享****

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

推荐阅读更多精彩内容

  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,725评论 1 21
  • 一、Docker创建镜像的方式有两种: 一种通过commit的方式:把做了一系列操作的容器关闭,然后利用docke...
    jie0112阅读 3,821评论 0 3
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,473评论 0 120
  • 目录 前言 Dockerfile的书写规则及指令使用方法 创建Dockerfile,构建运行环境 构建镜像 Doc...
    garyond阅读 72,287评论 0 43
  • 1. “每个女孩都有一个爱不了也恨不了的田季安” 这是舒淇有一次发的一条微博,那个田季安,是张震。 很多人都觉得舒...
    _王瘦子阅读 350评论 0 2