1. 前言

Dockerfile 是用来构建自定义 Docker 镜像的文本文档。我们通过docker build 命令用于从Dockerfile 文件构建镜像。如果你要构建自定义镜像,Dockerfile 是你必须学会的技能之一。

2. Dockerfile 的基本结构

Dockerfile 一般分为:基础镜像、镜像元信息、镜像操作指令和容器启动时执行指令,# 为 Dockerfile 中的注释。

3. Dockerfile 文件说明

Docker 从上到下的顺序运行Dockerfile 的指令,每一个指令都以 step 为步骤。而且文件的命名也必须为 Dockerfile 。

4. Dockerfile 常用的指令。

接下来对常用的 Dockerfile 指令进行总结。

4.1 FROM 指令

FROM是指定基础镜像,必须为第一个命令,格式:

FROM <image>:<tag>

其中 tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像。

示例: FROM mysql:5.6

4.2 MAINTAINER 指令

MAINTAINER 用来声明维护者信息,该命令已经过期,推荐使用 LABEL ,格式:

MAINTAINER <name>

4.3 LABEL 指令

LABEL:用于为镜像添加元数据,多用于声明构建信息,作者、机构、组织等。格式:

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

示例: LABEL version="1.0" description="felord.cn" by="Felordcn"

使用LABEL 指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

4.4 ENV 指令

ENV 用来设置环境变量,格式:

ENV <key> <value> # 之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量

ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"="的键值对,如果中包含空格,可以使用\来进行转义,也可以通过""来进行标识;另外,\ 也可以用于续行

示例: ENV version 1.0.0 或者 ENV version=1.0.0

可以通过 ${key} 在其它指令中来引用变量,如 ${version} 。我们也可以通过 docker run 中的 -e <ENV> 来动态赋值

4.5 ARG 指令

ARG 用于指定传递给构建运行时的变量,格式:

ARG <name>[=<default value>]

通过 docker run 中的 --build-arg <key>=<value> 来动态赋值,不指定将使用其默认值。

4.6 WORKDIR 指令

WORKDIR 用来指定工作目录,类似于我们通常使用的cd 命令,格式:

WORKDIR <PATH>

通过 WORKDIR 设置工作目录,Dockerfile 中的其它指令 RUNCMDENTRYPOINTADDCOPY等命令都会在该目录下执行。在使用 docker run 运行容器时,可以通过 -w 参数覆盖构建时所设置的工作目录。

4.7 ADD 指令

ADD 用于将本地文件添加到镜像中,tar 类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget,格式:

 ADD <src>... <dest>
# 用于支持包含空格的路径
ADD ["<src>",... "<dest>"]

示例:

ADD home /path/ # 支持通配符 添加所有以"home"开头的文件 到/path/ 下

4.8 COPY 指令

COPY 的功能类似于 ADD,但是不会自动解压文件,也不能访问网络资源

4.9 RUN 指令

RUN 用来执行构建镜像时执行的命令,有以下两种命令执行方式:

  • shell 执行格式:

RUN <command>

示例:RUN apk update

  • exec 执行格式:

    RUN ["executable", "param1", "param2"]

示例: RUN ["/dev/file", "p1", "p2"]

需要注意的是:RUN 指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用缓存镜像,可在构建时指定 --no-cache 参数,示例:docker build --no-cache

4.10 CMD 指令

CMD 构建容器后执行的命令,也就是在容器启动时才执行的命令。格式:

 # 执行可执行文件,优先执行
CMD ["executable","param1","param2"]
# 设置了 ENTRYPOINT,则直接调用ENTRYPOINT添加参数 参见 CMD 讲解
CMD ["param1","param2"]
# 执行shell命令
CMD command param1 param2

示例: CMD ["/usr/bin/bash","--help"]

CMD 不同于 RUNCMD 用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

4.11 ENTRYPOINT 指令

ENTRYPOINT 用来配置容器,使其可执行化。配合 CMD可省去 application,只使用参数。格式:

 #可执行文件, 优先
ENTRYPOINT ["executable", "param1", "param2"]
# shell内部命令
ENTRYPOINT command param1 param2

示例:

    FROM ubuntu

    ENTRYPOINT ["top", "-b"]

    CMD ["-c"]

ENTRYPOINT 与 CMD 非常类似,不同的是通过 docker run 执行的命令不会覆盖 ENTRYPOINT ,而 docker run 命令中指定的任何参数都会被当做参数再次传递给 ENTRYPOINT 指令。Dockerfile 中只有最后一个 ENTRYPOINT 命令起作用,也就是说如果你指定多个ENTRYPOINT,只执行最后的 ENTRYPOINT 指令。

4.12 EXPOSE 指令

EXPOSE 指定与外界交互的端口,格式:

EXPOSE <port> [<port>...]

示例: EXPOSE 8080 443 、EXPOSE 80 、EXPOSE 11431/tcp 12551/udp

EXPOSE 并不会直接让容器的端口映射主机。宿主机访问容器端口时,需要在 docker run 运行容器时通过 -p 来发布这些端口,或通过 -P 参数来发布EXPOSE 导出的所有端口

4.13 VOLUME 指令

VOLUME 用于指定持久化目录, 格式:

VOLUME ["<src>",...]

示例:VOLUME ["/data"]VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

  1. 卷可以容器间共享和重用

  2. 容器并不需要要和其它容器共享卷

  3. 修改卷后会立即生效

  4. 对卷的修改不会对镜像产生影响

  5. 卷会一直存在,直到没有任何容器在使用它

和 EXPOSE 指令类似, VOLUME 并不会挂载的宿主机,需要通过 docker run 运行容器时通过 -v 来映射到宿主机的目录中。参见另一个命令 docker volume create

4.14 USER 指令

USER 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用 USER 指定用户时,可以使用用户名、UID 或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,格式:

USER user
USER user:group
USER uid:group
USER uid
USER user:gid
USER uid:gid

使用 USER 指定用户后,Dockerfile 中其后的命令 RUNCMDENTRYPOINT 都将使用该用户。你可以通过 docker run 运行容器时,可以通过 -u 参数来覆盖指定用户。

4.15 ONBUILD 指令

ONBUILD 作用是其当所构建的镜像被用做其它镜像的基础镜像,该镜像中的 ONBUILD 中的命令就会触发,格式:

ONBUILD [INSTRUCTION]

示例:

ONBUILD ADD . /application/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

5. 总结

今天对构建 Docker 镜像脚本 Dockerfile 基本命令进行的详细的总结,并加以举例说明,相信能解决你在构建镜像中的一些困惑。敬请多多关注微信公众号:Felordcn ,后续将会有更多干货奉上。

附: Spring Boot Dockerfile

   # 使用 aws 的java jdk 8
FROM amazoncorretto:8
# 作者等相关的元信息
LABEL AUTHOR=Felordcn OG=felord.cn
# 挂载卷
VOLUME ["/tmp","/logs"]
# 时区
ENV TZ=Asia/Shanghai
# 启用配置文件 默认为 application.yml
ENV ACTIVE=defualt
# 设置镜像时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 修改为打包后的jar文件名称
ADD /target/flyway-spring-boot-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=${ACTIVE}","-jar","app.jar"]

  

#FROM 192.168.96.233:5000/java:8-apr
FROM openjdk:8
MAINTAINER git-developer
VOLUME ["/tmp"]
ADD ./target/energy-service.jar /app/
CMD ["java", "-XX:-UseGCOverheadLimit", "-Xmx4096m", "-Duser.timezone=UTC", "-jar", "/app/energy-service.jar"]
EXPOSE 9555
 

Dockerfile 基本命令的更多相关文章

  1. Dockerfile 自动制作 Docker 镜像(一)—— 基本命令

    Dockerfile 自动制作 Docker 镜像(一)-- 基本命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:手动制作Do ...

  2. docker-网络基础配置和dockerfile

    00x1: 端口映射: 如图:这就是把容器的 5000端口和主机的32768端口相映射,所以通过访问主机的32768端口就可以访问容器的web界面 这个端口是系统默认的如果自定义命令:docker r ...

  3. Docker02 基本命令、开发环境搭建、docker安装nginx、Dockerfile、路径挂载

    1 基本命令 1.1 docker相关 centos6.5 安装docker环境 >sudo yum install -y http://mirrors.yun-idc.com/epel/6/i ...

  4. Docker基本命令与使用 —— Dockerfile指令与构建(三)

    一.Dockerfile指令上 1.指令格式 # Comment 注释, 以#开头 INSTRUCTION argument 以大写的指令+参数 #First Dockerfile 注释 FROM u ...

  5. Hexo+Github博客最简教程-Dockerfile自动搭建

    闲谈 拿出你的气质,打开你的电脑,借你半小时搭建好属于你的hexo博客,小生用dockerfile自动帮你搭建好:你只需要在你的mac或linux或windows上提前把docker安装好,如何安装不 ...

  6. [置顶] docker--基础镜像和dockerfile

    制作基础镜像 注意:需要在CentOS6下操作 准备工作 yum -y install febootstrap 下载ISO镜像文件到服务器 mkdir /mnt/centos6/ mount -o l ...

  7. Dokcer基础使用总结(Dockerfile、Compose、Swarm)

    Dokcer基础 查看Linux版本 uname -r 查看Linux详尽信息 cat /etc/*elease CentOS Linux release (Core) NAME="Cent ...

  8. Dockerfile语法梳理

    Dockerfile语法 我们先来看一下上篇的 Dockerfile #获取base image FROM adoptopenjdk/openjdk8:latest #类似于执行 linux指令 RU ...

  9. Dockerfile极简入门与实践

    前文中,罗列了docker使用中用到的基本命令 此文,将会对怎样使用Dockerfile去创建一个镜像做简单的介绍 Dockerfile命令 要开始编写Dockerfile,首先要对相关的命令有个清晰 ...

随机推荐

  1. Mapbox矢量瓦片标准(mapbox vector-tile-spec)

    目录 1. 目标 2. 文件格式 2.1. 文件后缀 2.2 MIME类型 3. 投影和范围 4. 内部结构 4.1. 图层 4.2. 要素 4.3. 几何图形编码 4.4. 要素属性 4.5. 示例 ...

  2. regexp_replace

    pandas和SQL数据分析实战 https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2&sha ...

  3. RocketMQ安装部署

    一.简介RocketMQ RocektMQ是阿里巴巴在2012年开源的一个纯java.分布式.队列模型的第三代消息中间件,不仅在传统高频交易链路有着低延迟的出色表现,在实时计算等大数据领域也有着不错的 ...

  4. OpenShift 4.2 etcd operatorhub离线环境部署

    本文记录在OperatorHub中存在界面但缺少镜像的环境下如何安装部署.感谢王征提供的大力支持和指导. 现在一个在线环境找到etcd所需要的镜像 quay.io/coreos/etcd-operat ...

  5. xcode简单教程

    1.使用Xcode软件.Xcode是一个苹果系统上的集成开发环境(IDE),就是说用Xcode就能编写C语言程序,并编译运行.也能开发ios程序等,是一种软件.在windows上类似这种能编c语言的还 ...

  6. Android逆向破解:Android Killer使用

    目录   目录 软件介绍 Android Killer是一款可以对APK进行反编译的工具,它能够对反编译后的Smali文件进行修改,并将修改后的文件进行打包. 软件下载 这里用的是@昨夜星辰2012 ...

  7. 使用 Alibaba 的 Homebrew 镜像源进行加速

    使用 Alibaba 的 Homebrew 镜像源进行加速 平时我们执行 brew 命令安装软件的时候,跟以下 3 个仓库地址有关: brew.git homebrew-core.git homebr ...

  8. XT交易所API

    HTTPAPI xt为用户提供了一个简单的而又强大的API,旨在帮助用户快速高效的将xt交易功能整合到自己应用当中. API地址域名地址 域名地址:https://www.xt.com/ 使用说明 使 ...

  9. Centos7.3之K8S安装初体验

    容器是发展趋势,所以是时候从虚拟机中脱离出来,投入到容器化的怀抱中了. 曾经试过安装k8s,都没有成功,各种乱七八糟的报错,于是一拖再拖,这次总算发现一个可以快速部署的工具,终于安装成功了. 这个k8 ...

  10. rc.local添加tomcat服务启动命令,但是tomcat服务无法正常启动

    遇到了一个特别坑的问题. 本来想着在rc.local文件里添加tomcat启动命令,使tomcat开机自启.之前在其他服务器上直接这样操作是没问题的,但很幸运的是,现在忽然就不行了. 开始排错: 1. ...