专栏首页kubernetes中文社区Docker之详解 Dockerfile

Docker之详解 Dockerfile

什么是Dockerfile?

Dockerfile是由多行命令语句组成的构建镜像的文件,一般命令分成四部分:基础镜像信息,元数据信息,镜像操作指令和容器启动时执行的指令。并且支持使用#作为注释使用。

Dockerfile指令:

1、FROM
格式:FROM <image>或 FROM <image>:<tag>
基础镜像来源,必须在第一行指令中指定,不指定标记则默认为latest。

2、LABEL格式:LABEL <name>=<value>
指定添加元数据到镜像,可指定多个标签信息。

3、RUN格式:RUN <command>
每条指令将在当前镜像基础上执行,并提交为新的镜像。

4、CMD格式:CMD <command>
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD指令,如果指定了多条CMD指令,则只会执行最后一条CMD指令。如果在启动镜像时指定了启动指令,则镜像预设的CMD指令不执行。一般用于执行容器时提供默认值。

5、EXPOSE格式:EXPOSE <port>
指定镜像启动后暴露的端口,在容器启动时需要通过 -p 做端口映射

6、ENV格式:ENV <key> <value>
指定环境变量,使用在构建阶段中的所有后续指令的环境。

7、ADD格式:ADD  <src> <dest>
该指令会在<src>(本地文件系统或远程网络位置) 进行复制新文件,并将它们添加到路径上图像的文件系统中<dest>。

8、COPY格式:COPY <src> <dest>
复制本地主机的 <src> (为 Dockerfile 所在目录的相对路径) 到容器中的 <dest>。

9、ENTRYPOINT格式:ENTRYPOINT <command>
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。如果指定了多条ENTRYPOINT指令,则只会执行最后一条ENTRYPOINT指令。

10、VOLUME格式:VOLUME  <FileSystemMountPoint>
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

11、USER格式:USER <user>:<group> | USER <uid>:<gid>
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。

12、WORKDIR格式:WORKDIR <FileSystemPath>
为后续的 COPY、ADD、RUN、CMD、ENTRYPOINT 指令配置工作目录。(可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径, 则会基于之前命令指定的路径)

13、ARG格式:ARG <varname>[=<value>]
该ARG指令定义了一个变量,用户可以docker build使用该--build-arg <varname>=<value> 标志在构建时将该变量传递给构建器。

14、ONBUILD格式:ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令,就好像它已经FROM在下游指令之后立即插入一样 Dockerfile。

15、STOPSIGNAL格式:STOPSIGNAL <signal>
设置将发送到容器的系统调用信号以退出。此信号可以是与内核的系统调用表中的位置匹配的有效无符号数,例如9,或SIGNAME格式的信号名,例如SIGKILL。

16、HEALTHCHECK格式:HEALTHCHECK [OPTIONS] CMD command
测试容器以检查它是否仍在工作。即使服务器进程仍在运行,这也可以检测到陷入无限循环且无法处理新连接的Web服务器等情况。当容器指定了运行状况检查时,除了正常状态外,它还具有运行状况。这个状态最初是starting。每当健康检查通过时,它就会变成healthy(以前所处的状态)。经过一定数量的连续失败后,它就变成了unhealthy。

17、SHELL格式:SHELL ["executable", "parameters"]
该SHELL指令允许覆盖用于shell命令形式的默认shell。Linux上的默认shell是["/bin/sh", "-c"],而在Windows上["cmd", "/S", "/C"]。该SHELL指令必须以JSON格式写入Dockerfile。

Dockerfile构建镜像

FROM centos:latest
LABEL maintainers="yekangming"
RUN echo "helloworld"
CMD ["/bin/echo", "hellodocker"]
docker build -t app:v1 .

作者:叶康铭

地址:https://yq.aliyun.com/articles/702887

本文分享自微信公众号 - kubernetes中文社区(DailyDev)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最简单的教程:在Ubuntu操作系统里安装Docker

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • 用docker建主机的几个要点 原

    docker run --privileged=true --dns=192.168.1.1 --name shop-t -d -p 8080:80 -v /p...

    双面人
  • Docker Hello World容器运行报错的解决办法

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.blog....

    Jerry Wang
  • docker 容器的使用[php 5.6 mysql5.7] 原

    需要启动systemd进程 --privileged[需要启动systemctl] docker run --privileged -tdi -p 80...

    双面人
  • Docker和宿主机操作系统文件目录互相隔离的实现原理

    我们知道在Docker容器里是无法访问到宿主操作系统的文件目录的,但这种隔离是怎么实现的呢?

    Jerry Wang
  • Docker:Docker实现同Ip网段联通 转

    宿主机A 和宿主机B是网络联通关系,在宿主机A上面创建了多个容器组成集群,但是我希望通过宿主机B也可以访问到宿主机A的容器,当然,你也可能会说,端口映射非常方便...

    双面人
  • 如何让docker容器和宿主机在一个网段,并组成局域网 转

    (adsbygoogle = window.adsbygoogle || []).push({});

    双面人
  • 什么是Kubernetes的CRI - 容器运行时接口

    我们都知道Kubernetes不会直接和容器打交道,Kubernetes的使用者能接触到的概念只有pod,而pod里包含了多个容器。当我们在Kubernetes...

    Jerry Wang
  • 如何给Docker hub用户上传头像

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.blog.csdn.net/article/detai...

    Jerry Wang
  • Grafana使用docker安装运行

    Grafana的页面现在也可以正常打开了,从上面看登陆需要用户名和密码,这个用户名和密码从哪里来的呢?

    Devops海洋的渔夫

扫码关注云+社区

领取腾讯云代金券