专栏首页DevOps时代的专栏Dockerfile 详解,看这一篇就够了

Dockerfile 详解,看这一篇就够了

指令格式有两种:注释和指令

注释以井号开头,后面跟上信息

指令以大写的指令名开头,后面跟上参数

常见的指令

FROM

两种形式如下:

FROM <IMAGE>
FROM <IMAGE>:<TAG>

通过FROM指定的镜像名称必须是一个已经存在的镜像,这个镜像称之为基础镜像,必须位于第一条非注释指令

MAINTAINER

MAINTAINER <NAME>

指定镜像的作者信息,包含镜像的所有者和联系人信息

RUN

用于指定构建镜像时运行的命令,两种模式:

RUN <command> (shell模式)
RUN [ "executable", "param1", "param2" ] (exec模式)

在shell模式下,是使用/bin/sh -c COMMAND来运行命令的 在exec模式下可以指定其他的shell来运行命令RUN [“/bin/bash”, “-c”, “echo hello”]

多条RUN指令可以合并为一条:

RUN yum install httpd && yum install ftp

这样在构建的时候会减少产生中间层镜像

EXPOSE

指定运行该镜像的容器使用的端口,可以是多个。

EXPOSE <PORT>

使用这个指令的目的是告诉应用程序容器内应用程序会使用的端口,在运行时还需要使用-p参数指定映射端口。这是docker处于安全的目的,不会自动打开端口。

docker run -p 80 -d dockertest/dockerfile_build nginx -g "daemon off"

CMD

用于提供容器运行的默认命令,如果在docker run时指定了运行的命令,则CMD命令不会执行。

CMD有三种模式:

CMD <command> (shell模式)
CMD [ "executable", "param1", "param2" ] (exec模式)
CMD [ 'param1', 'param2'] (通常与ENTRYPOINT搭配指定ENTRYPOINT的默认参数)

ENTRYPOINT

与CMD类似,ENTRYPOINT不会被docker run中指定的命令覆盖,如果想覆盖ENTRYPOINT,则需要在docker run中指定--entrypoint选项

它有两种模式:

ENTRYPOINT <command> (shell模式)
ENTRYPOINT [ "executable", "param1", "param2" ] (exec模式)

ADD和COPY

作用都是将文件或目录复制到Dockerfile构建的镜像中

ADD <src> <dest>
ADD ["<src>" "<dest>"] (适用于文件路径包含空格的情况)

COPY <src> <dest>
ADD ["<src>" "<dest>"] (适用于文件路径包含空格的情况)

ADD包含了类似tar的解压功能,如果只是单纯复制文件,建议使用COPY,而且,两者的源文件路径使用Dockerfile相对路径,目标路径使用绝对路径。

COPY index.html /var/www/html

VOLUME

用于向容器添加卷,可以提供共享存储等功能

VOLUME ['/data']

WORKDIR

在容器内部设置工作目录,这样ENTRYPOINT和CMD指定的命令都会在容器中这个目录下进行。

WORKDIR /path/to/workdir

ENV

用于设置环境变量

ENV <KEY> <VALUE>
ENV <KEY>=<VALUE>

USER

用于指定镜像为什么用户去运行

USER nginx

镜像就会以nginx身份运行,可以使用uid,gid等各种组合使用

ONBUILD

为镜像创建触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行。当子镜像被构建时会插入触发器中的指令。

ONBUILD COPY index.html /var/www/html

Dockerfile的构建过程

  1. docker会从Dockerfile文件头FROM指定的基础镜像运行一个容器
  2. 然后执行一条指令,对容器修改
  3. 接着执行类似docker commit的操作,创建新的镜像层
  4. 在基于刚创建的镜像运行一个新的容器
  5. 执行Dockerfile下一条指令,直到所有指令执行完毕

docker会删除中间层创建的容器,但不会删除中间层镜像,所以可以使用docker run运行一个中间层容器,从而查看每一步构建后的镜像状态,这样就可以进行调试。

构建缓存

docker在构建过程中会将之前构建的镜像看做缓存。

当第一次构建的时候,构建过程会比较慢,而在此进行相同的构建的时候,会看见using cache字样,表示使用了缓存,构建过程也非常快。

如果不想使用构建缓存,则在docker build中使用—no-cache选项。

还可以在Dockerfile中使用ENV REFRESH_DATE 2018-01-01来制定缓存刷新时间,更改这个时间,就会让后面的命令不使用缓存。

原文链接:https://blog.csdn.net/sinat_35930259/article/details/79679294

本文分享自微信公众号 - DevOps时代(DevOpsTimes),作者:lyzkks

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

原始发表时间:2019-08-21

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你确定你会写 Dockerfile 吗?

    如今 GitHub 仓库中已经包含了成千上万的 Dockerfile,但并不是所有的 Dockerfile 都是高效的。本文将从五个方面来介绍 Dockerfi...

    DevOps时代
  • 基于 Github+Jenkins+Maven+Docker 自动化构建部署

    传统的开发、测试、部署方式,是由开发人员本机或打包机进行打包,将war包提交给测试人员部署,测试通过后,再由实施人员负责部署到预发、生产环境中。中间的衔接不连贯...

    DevOps时代
  • 《百度工程能力白皮书-工程标准V1.0》震撼发布!(附白皮书下载链接)

    10月17日,第六届百度技术开放日成功召开,开放日内容涵盖AI开发的工程方法等亮点,尤其是首次发布的“软件工程能力白皮书(软件工程标准1.0)”获得参会嘉宾和各...

    DevOps时代
  • 快速学习Docker-Docker-file的指令格式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • 使用Docker镜像

    镜像是Docker三大核心概念中最重要的一部分,而Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker会尝试从默认的镜像仓库中下载(默认使...

    编程思录
  • Docker的镜像

    镜像是容器的运行基础,容器是镜像运行后台的形态 镜像的概念 镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式...

    coders
  • 如何理解Docker镜像分层?且听百度高级研发工程师细细道来

    所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等。

    本人秃顶程序员
  • Kunbernetes-基于Nexus构建私有镜像仓库

    Nexus是Sonatype提供的仓库管理平台,Nuexus Repository OSS3能够支持Maven、npm、Docker、YUM、Helm等格式数据...

    菲宇
  • Docker 入门到实战教程(五)构建Docker镜像

    Docker 镜像(Image)是一种分层结构的文件系统,基于Docker Hub中已构建好的镜像后,我们可以快速构建自己的镜像。还可以将自己构建的镜像免费推送...

    小东啊
  • Docker私有镜像仓库是什么?

    镜像仓库作为Docker技术的核心组件之一,其主要作用就是负责镜像内容的存储和分发。Docker镜像仓库从使用范围来说分为“公有镜像仓库”和“私有镜像仓库”,公...

    用户5927304

扫码关注云+社区

领取腾讯云代金券