作者信息:https://home.cnblogs.com/u/huangjiabobk

在运维工作中,Dockerfile中常见指令有哪些?

在运维工作中,Dockerfile 是构建 Docker 镜像的关键配置文件。它通过一系列指令定义了如何构建镜像,包括安装依赖、设置环境变量、复制文件等。以下是一些常见的 Dockerfile 指令及其用途:

1. FROM
  • 用途:指定基础镜像(Base Image),所有 Dockerfile 必须以 FROM 指令开始。

  • 格式FROM <image>FROM <image>:<tag>

  • 示例

    FROM ubuntu:20.04
  • 说明FROM 指令可以多次使用,每次使用都会创建一个新的阶段(Stage),常用于多阶段构建。

2. RUN
  • 用途:在镜像构建过程中执行命令,用于安装软件包、运行脚本等。

  • 格式RUN <command>RUN ["executable", "param1", "param2"]

  • 示例

    RUN apt-get update && apt-get install -y curl
  • 说明RUN 每执行一次都会创建一个新的镜像层,因此建议将多个命令合并为一行,以减少镜像层数。

3. COPY
  • 用途:将本地文件或目录复制到镜像中。

  • 格式COPY <src> <dest>COPY ["<src>", "<dest>"]

  • 示例

    COPY ./app /usr/local/bin/app
  • 说明COPY 支持相对路径和绝对路径,且不会自动解压压缩文件。

4. ADD
  • 用途:类似于 COPY,但支持自动解压压缩文件(如 .tar.gz)。

  • 格式ADD <src> <dest>

  • 示例

    ADD myapp.tar.gz /usr/local/bin/
  • 说明ADD 的功能比 COPY 更强大,但建议优先使用 COPY,因为 ADD 的自动解压功能可能导致意外行为。

5. WORKDIR
  • 用途:设置工作目录(Working Directory),后续指令将在此目录下执行。

  • 格式WORKDIR <path>

  • 示例

    WORKDIR /app
  • 说明:如果目录不存在,WORKDIR 会自动创建。

6. ENV
  • 用途:设置环境变量,可在后续指令中使用。

  • 格式ENV <key>=<value>ENV <key1>=<value1> <key2>=<value2>

  • 示例

    ENV MY_VAR="Hello, World!"
  • 说明:环境变量在容器运行时仍然有效。

7. EXPOSE
  • 用途:声明容器运行时监听的端口。

  • 格式EXPOSE <port> [<port>...]

  • 示例

    EXPOSE 80 443
  • 说明EXPOSE 不会实际暴露端口,仅用于文档说明。实际暴露端口需要在运行容器时使用 -p 参数。

8. CMD
  • 用途:指定容器启动时默认执行的命令。

  • 格式CMD ["executable", "param1", "param2"]CMD <command>

  • 示例

    CMD ["./app", "start"]
  • 说明CMD 可以被 docker run 命令中的参数覆盖。

9. ENTRYPOINT
  • 用途:设置容器启动时的入口程序。

  • 格式ENTRYPOINT ["executable", "param1", "param2"]ENTRYPOINT <command>

  • 示例

    ENTRYPOINT ["./app"]
  • 说明ENTRYPOINTCMD 的区别在于,ENTRYPOINT 不会被覆盖,而是将 CMD 的参数追加到 ENTRYPOINT 后面。

10. VOLUME
  • 用途:声明一个挂载点,用于持久化数据。

  • 格式VOLUME <path>

  • 示例

    VOLUME /data
  • 说明VOLUME 用于定义容器内部的持久化目录,通常用于存储日志、数据库文件等。

11. USER
  • 用途:切换用户,指定后续指令的执行用户。

  • 格式USER <username>USER <uid>

  • 示例

    USER myuser
  • 说明:建议在构建镜像时切换到非 root 用户,以提高安全性。

12. ARG
  • 用途:定义构建时的变量,仅在构建过程中有效。

  • 格式ARG <name>=<default_value>

  • 示例

    ARG version=1.0
  • 说明ARG 的值可以通过 docker build --build-arg 参数动态传入。

13. HEALTHCHECK
  • 用途:定义容器的健康检查机制。

  • 格式HEALTHCHECK --interval=<interval> --timeout=<timeout> CMD <command>

  • 示例

    HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost/ || exit 1
  • 说明HEALTHCHECK 用于检测容器是否正常运行,Docker 会根据检查结果决定容器的健康状态。

14. LABEL
  • 用途:为镜像添加元数据标签。

  • 格式LABEL <key>=<value>

  • 示例

    LABEL version="1.0" author="John Doe"
  • 说明LABEL 提供了镜像的额外信息,便于管理和查询。

15. ONBUILD
  • 用途:设置触发器,当镜像被其他镜像作为基础镜像时,自动执行指定的指令。

  • 格式ONBUILD <instruction>

  • 示例

    ONBUILD COPY . /app/
  • 说明ONBUILD 通常用于创建通用的基础镜像。

16. 我的总结

在运维工作中,熟练掌握这些 Dockerfile 指令可以帮助你高效地构建和管理 Docker 镜像。以下是一些最佳实践:

  1. 保持镜像轻量:尽量使用小型基础镜像(如 alpine)。
  2. 减少镜像层数:将多个 RUN 指令合并为一行。
  3. 使用多阶段构建:通过 FROM 指令分阶段构建,减少最终镜像大小。
  4. 安全性:切换到非 root 用户,避免在镜像中暴露敏感信息。
  5. 可维护性:使用清晰的注释和合理的文件结构,便于后续维护。
posted @   黄嘉波  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
历史上的今天:
2024-02-18 在k8S中,容器内日志是怎么采集的?
2024-02-18 在k8S中,Helm优缺点是什么?
2024-02-18 在k8S中,flannel和calico的作用和区别是什么?
2024-02-18 在k8S中,QoS作用是什么?
2024-02-18 在k8S中,Master节点高可用是如何做的?
版权声明:原创作品,谢绝转载!否则将追究法律责任。--作者 黄嘉波
点击右上角即可分享
微信分享提示