本文介绍Dockerfile相关的知识。

一、概述

Dockerfile是构建docker镜像的文件,该文件描述了如何构建docker镜像。有其的语法和使用方式,注释使用“#”。
在实际使用中,可以基于官方或其它镜像,再进行创建。
Dockerfile分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
例如:

#这里说明基础镜像信息
#......
FROM ubuntu#这里说明维护者信息
#......
MAINTAINER DOCKER_USER#这里说明镜像操作指令
#.......
RUN apt-get update#这里说明容器启动时执行指令
CMD /bin/bash

大部分Dockerfile都有这几部分组成。Dockerfile学习起来不容易,但也不困难,在了解基本概念后,最好的方法是阅读官方的Dockerfile文件。列举几个如下:

busybox:https://github.com/docker-library/busybox/blob/4b11c30f87d3033b2abd446c9bc1ef12f96abaa0/uclibc/Dockerfile (仅三行,可从此入手实践)
redis:https://github.com/docker-library/redis/blob/ede954da6de61f1d6a8572db4cd7bdf1278a2815/5.0/Dockerfile
mysql:https://github.com/docker-library/mysql/blob/ed0e47e48b8ca3dbc4d68d68f56384bdd1fb5cdb/5.6/Dockerfile

笔者也积累了一些,有兴趣可以参考:https://github.com/latelee/dockerfile。

二、指令说明

指令的一般格式为<指令> <参数>,指令包括FROM、MAITNTAINER、RUN等,简列如下:

FROM 指定所创建镜像的基础镜像
MAINTAINER  指定维护者信息
RUN 运行命令
CMD 指定启动容器时默认执行的命令
LABEL   指定生成镜像的元数据标签信息
EXPOSE  声明镜像内服务所监听的端口
ENV 指定环境变量
ADD 复制指定的路径下的内容到容器下
COPY    复制本地主机的路径下的内容到镜像中
ENTRYPOINT  指定镜像的默认入口
VOLUME  创建数据卷挂载点
USER    指定运行容器时的用户名或UID
WORKDIR 配置工作目录
ARG 指定镜像内使用的参数(如版本号信息等)
ONBUILD 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
STOPSIGNAL  容器退出的信号值
HEALTHCHECK 如何进行健康检查
SHELL   指定使用shell时的默认shell类型

下面分别进行介绍。

FROM

功能为指定基础镜像,并且必须是第一条指令。如果本地镜像不存在或者镜像仓库中不存在,则回去DockerHub下载指定镜像。 如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)。
语法:

FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>

三种写法,其中和 是可选项,如果没有选择,那么默认值为latest。

RUN

功能为运行指定的命令。
语法:

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

第一种后边直接跟shell命令,在linux操作系统上默认为/bin/sh –c
第二种是类似于函数调用。可将executable理解成为可执行文件,后面就是两个参数。
示例:

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层。
多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

RUN命令较长书写较长时可以使用换行符\。示例:

RUN apt-get update \&& apt-get install vim

CMD

功能为容器启动时要运行的命令。
语法:

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。用户在启动容器时手动指定了运行的命令,则会覆盖CMD指定的命令。
示例:

CMD [ "sh", "-c", "echo $HOME"
CMD [ "echo", "$HOME" ]

补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。

LABEL

功能是为镜像指定生成镜像的元数据标签信息。
语法:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

示例:

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖。

MAINTAINER

功能指定作者
语法:

MAINTAINER <name>

示例:

MAINTAINER  "li@latelee.org"

该信息会写入生成镜像的Author属性域中。

EXPOSE

功能为暴漏容器运行时的监听端口给外部。
语法:

EXPOSE <PORT> [<PORT>…]

示例:

EXPOSE 22 80 443

注意,该指令只是起到声明作用,并不会自动完成端口映射,需要在启动容器时加-p。

ENV

功能为设置环境变量
语法:

ENV <key> <value>
ENV <key>=<value> ...

示例:

ENV PATH /usr/local/bin:$PATH

ADD

功能把文件复制到镜像中。
如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。
语法:

ADD <src>... <dest>
ADD ["<src>",... "<dest>"]

<dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径
<src>可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
如果把<src>写成一个url,那么ADD就类似于wget命令

示例:

ADD test relativeDir/
ADD test /relativeDir
ADD http://example.com/foobar /

尽量不要把<scr>写成一个文件夹,如果<src>是一个文件夹了,复制整个目录的内容,包括文件系统元数据

COPY

功能把文件复制到镜像中。
语法:

COPY <src>... <dest>
COPY ["<src>",... "<dest>"]

与ADD的区别,COPY的<src>只能是本地文件,其他用法一致

ENTRYPOINT

功能是启动时的默认入口命令。该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数。
语法:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

只能写一条,如果写了多条,那么只有最后一条生效。

VOLUME

功能可以将文件夹或者其他容器中的文件夹挂在到这个容器中。
语法:

VOLUME ["/data"]

说明:
["/data"]可以是一个JsonArray ,也可以是多个值。
例如:

VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db

一般的使用场景为需要持久化存储数据时,当数据需要持久化时用这个命令。

USER

功能设置启动容器的用户,可以是用户名或UID。
语法:

USER daemo
USER UID

注意:如果设置了容器以daemon用户去运行,那么RUN、CMD和ENTRYPOINT都会以这个用户去运行

WORKDIR

功能为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
语法:

WORKDIR /path/to/workdir

如果不存在则会创建,也可以设置多次。
示例:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

pwd执行的结果是/a/b/c

WORKDIR也可以解析环境变量。
示例:

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

pwd的执行结果是/path/$DIRNAME

ARG

功能指定镜像内使用的参数(版本号信息等)。
语法:

ARG <name>[=<default value>]

设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数。
示例:

FROM busybox
ARG user1
ARG buildno=1

三、创建镜像

编写完成Dockerfile之后,可以通过docker build命令来创建镜像。
语法:

docker build [OPTIONS] PATH | URL | -

示例:

#docker build –t ubuntu:v1 .

注意:命令后面的点号表示当前路径,默认文件名称为Dockerfile,如果不是这个名称,需要手动指定,但一般都用默认的。

我的docker随笔11:Dockerfile编写相关推荐

  1. 【docker】基于dockerfile编写LNMP

    文章目录 一.基础环境准备 二.部署nginx(容器IP为172.18.0.10) 1.整个Dockerfile文件内容 2.配置nginx.conf文件 3.构建镜像 三.部署mysql 1.整个D ...

  2. Docker系列07—Dockerfile 详解

    Docker系列07-Dockerfile 详解 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Do ...

  3. [转]Docker基础-使用Dockerfile创建镜像

    本文转自:https://www.cnblogs.com/jie-fang/p/7927643.html 1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # T ...

  4. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken

    前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...

  5. Docker基础-使用Dockerfile创建镜像

    目录 1.基本结构 1.1 在debian:jessie基础镜像上安装nginx环境,从而创建一个新的nginx镜像: 1.2 基于buildpack-deps:jessie-scm基础镜像,安装go ...

  6. 【Docker】之 Dockerfile 指令详解

    目录 Dockerfile 基本结构 Dockerfile 指令 指定基础镜像 FROM 维护者信息 MAINTAINER 元数据标签 LABEL 设置环境变量 ENV 镜像构建参数 ARG 指定工作 ...

  7. Docker(三):Dockerfile 命令详解

    上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dock ...

  8. 最简单的Go Dockerfile编写姿势

    1. Dockerfile一些额外注意点 选择最简单的镜像 比如alpine,整个镜像5M左右 设置镜像时区 RUN apk add --no-cache tzdata ENV TZ Asia/Sha ...

  9. Dockerfile编写、Dockerfile常用命令

    FROM #基于某个镜像进行创建 FROM java:8 FROM centos ENV #指定环境变量 ENV JAVA_OPTS = "-Xms1g -Xmx1g" MAINT ...

最新文章

  1. SpringBean默认是单例的,高并发情况下,如何保证并发安全?
  2. Java -jar启动服务与Tomcat服务器上部署JAR之间的区别
  3. python精通书籍-清华学霸整理,Python入门到精通这几本书帮你快速入行
  4. 应用层协议:HTTP与HTTPS协议详解、二者的区别
  5. linux强制停止压缩任务,6.25任务(linux压缩、打包命令:zip、tar)
  6. DataFrame字符串之分割split()、清洗drop()、合并concat()、重新建立索引reset_index() - (Python)
  7. FI常用T-CODE
  8. jdk源码——HashMap
  9. chrome扩展程序获取当前页面URL和HTML内容
  10. 点击input,区域选中后外面会出现其他颜色边框去除方式和更改input字体颜色
  11. bzoj5406: Gift
  12. 编写python程序、利用循环输出1+11+111+1111_《JavaScript语法基础》练习第四章第五题练习...
  13. 拓端tecdat|如何在R语言中建立六边形矩阵热图heatmap可视化
  14. 错误解决办法:gcc编译时提示对‘sqrt’未定义的引用
  15. rs232转usb驱动_Trinamic发布6轴步进电机驱动模块TMCM-6214
  16. 2017 ACM-ICPC Asia Shenyang (ICPC亚洲沈阳赛区)
  17. 记录隐藏ubuntu桌面图标
  18. FFT中的频谱泄露现象分析
  19. [阿里天池]Baby Goods Info Data
  20. 数独游戏 | c++ | BFS

热门文章

  1. python 只取年月日 字符串_Python基础:数据类型和变量amp;字符串和编码
  2. OPPO Find X5/Pro搭载一体化流线设计,采用双芯片战略
  3. 贝壳反击浑水做空报告 股价上涨近6%
  4. 起售价仅7699元!全新折叠旗舰OPPO Find N发布
  5. 西门子宣布美国充电桩扩产计划
  6. TechWeb:转载合作须知!
  7. 外媒:特斯拉申请新商标 寻求进入餐饮业
  8. 2020年朋友圈十大谣言:包括蚊蝇可以传播新冠病毒等
  9. 魅族17系列邀请函来了:防爆盾外观实锤 或4月15日亮相
  10. 5G手机产业链将带动多少A股上市公司?