博客
关于我
再学dockerfile
阅读量:477 次
发布时间:2019-03-06

本文共 1785 字,大约阅读时间需要 5 分钟。

Dockerfile 指南:从基础到实战

前言

docker 的系统学习可以看我这篇博文,如果你想深入了解docker系统,推荐阅读我的另一篇博文。

简介

Dockerfile 是一个用于构建 docker 镜像的文本文件,它通过一系列指令逐步构建镜像。镜像的构建过程从基础镜像开始,每条指令都会生成新的镜像层,最终形成完整的镜像文件。

Dockerfile 的结构

Dockerfile 通常分为几个部分:

  • 基础镜像信息:镜像的来源。
  • 维护者信息:镜像的作者。
  • 镜像操作指令:包括文件复制、环境变量设置、运行命令等。
  • 容器启动时执行指令:定义容器启动时的默认命令。
  • 每条指令都以 # 开头的注释将被忽略,注释的内容不会被镜像构建过程执行。

    Dockerfile 的详解

    FROM

    指定镜像的基础镜像,且必须是 Dockerfile 中第一条非注释指令。如果没有指定基础镜像,默认使用 scratch

    语法:

    FROM # 或者FROM :
    # 或者FROM

    可以是镜像名称或镜像 ID。如果指定了

    ,可以指定镜像的标签。如果指定了
    ,可以指定镜像的摘要。

    每次使用 FROM 指令时,只需记录之前镜像的 ID。

    LABEL

    为镜像指定标签,key 和 value 可以重复,但建议每个 key 只使用一次。标签会继承基础镜像的标签,若 key 相同,值会覆盖。

    语法:

    LABEL key = value# 或者LABEL key1 = value1 \    key2 = value2

    ENV

    设置环境变量。

    语法:

    ENV key = value# 或者ENV key1 = value1 \    key2 = value2

    ADD

    将文件或目录复制到镜像中。如果源是 URL,会类似于 wget下载。如果源是多个文件,目标必须是目录。

    语法:

    ADD src/ /dest/

    COPY

    类似于 ADD,但只能复制本地文件。

    语法:

    COPY src/ /dest/

    RUN

    运行命令,构建镜像时会缓存结果。可以手动设置 --no-cache=true 来禁用缓存。

    语法:

    RUN command

    CMD

    容器启动时执行的命令。CMD 可以是 shell 命令或可执行文件。

    语法:

    CMD ["executable", "param1", "param2"]# 或者CMD command param1 param2

    ENTRYPOINT

    容器启动时默认执行的命令。

    语法:

    ENTRYPOINT ["executable", "param1", "param2"]# 或者ENTRYPOINT command param1 param2

    USER

    设置容器启动时的用户。需要确保容器内有该用户权限。

    语法:

    USER username# 或者USER uid

    VOLUME

    实现宿主机目录到容器的挂载。AUFS 不支持持久化数据,需手动指定。

    语法:

    VOLUME ["/data/"]

    WORKDIR

    设置工作目录,对 RUNNING 指令等生效。不存在则创建。

    语法:

    WORKDIR /path/to/workdir

    ONBUILD

    用于镜像构建时触发其他镜像构建。

    语法:

    ONBUILD RUN ls -l

    EXPOSE

    暴露容器中的端口。需要在运行时使用 -p 或 -P 将端口映射到主机。

    语法:

    EXPOSE 8080

    STOPSIGNAL

    设置容器停止时发送的信号,默认为 15。

    语法:

    STOPSIGNAL signal

    Dockerfile 中的变量

    $varname ${varname} ${varname:-default value} ${varname:+default value}

    原则及建议

  • 轻量化镜像:减少镜像层数,避免不必要的依赖。
  • 使用 .gitignore:清理构建目录,提高效率。
  • 分解服务:一个容器只做一件事,解耦复杂应用。
  • 减少镜像层:避免多个 LABEL、ENV 等标签。
  • 参数排序:安装包时按字母排序。
  • 构建缓存:默认启用,除非设置 --no-cache=true。
  • 实战

    我的另一篇博文详细讲解了 docker 实战经验。

    转载地址:http://xtgbz.baihongyu.com/

    你可能感兴趣的文章
    npm start运行了什么
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>
    npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
    查看>>
    npm—小记
    查看>>
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>
    npm入门,这篇就够了
    查看>>
    npm切换到淘宝源
    查看>>
    npm切换源淘宝源的两种方法
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm包管理深度探索:从基础到进阶全面教程!
    查看>>
    npm升级以及使用淘宝npm镜像
    查看>>
    npm发布包--所遇到的问题
    查看>>
    npm发布自己的组件UI包(详细步骤,图文并茂)
    查看>>
    npm和package.json那些不为常人所知的小秘密
    查看>>
    npm和yarn清理缓存命令
    查看>>
    npm和yarn的使用对比
    查看>>
    npm如何清空缓存并重新打包?
    查看>>