Dockerfile常用指令详解

Dockerfile 是一个用于定义 Docker 镜像构建过程的脚本文件,其中包含了一系列指令,用于指定如何构建和配置镜像。以下是一些常用的 Dockerfile 指令及其示例用法:

1. FROM

指定基础镜像,Dockerfile 必须以该指令开始。

示例:

bash 复制代码
FROM ubuntu:20.04

这行表示以 Ubuntu 20.04 作为基础镜像。

2. RUN

执行命令行指令,通常用于安装软件包或进行系统配置。

示例:

bash 复制代码
RUN apt-get update && apt-get install -y curl

这行表示在镜像中更新包列表并安装 curl。

3. COPY

将文件或目录从构建上下文复制到镜像中。

示例:

bash 复制代码
COPY ./myapp /app

这行表示将当前目录下的 myapp 文件夹复制到镜像中的 /app 目录。

4. ADD

类似于 COPY,但支持自动解压 tar 文件并且可以从 URL 直接下载文件。

示例:

bash 复制代码
ADD myapp.tar.gz /app

5. WORKDIR

设置工作目录,此后的命令将在该目录下执行。

示例:

bash 复制代码
WORKDIR /app

这行表示设置 /app 为工作目录。

6. CMD

指定容器启动时执行的命令。Dockerfile 中只能有一个 CMD,多个会被覆盖。

示例:

bash 复制代码
CMD ["python", "app.py"]

这行表示容器启动时执行 python app.py 命令。

7. ENTRYPOINT

类似于 CMD,但通常用于定义一个固定的命令,CMD 的参数会被附加到 ENTRYPOINT 的后面。

示例:

bash 复制代码
ENTRYPOINT ["python"]
CMD ["app.py"]

这行表示容器启动时执行 python app.py,用户运行容器时提供的参数会附加在 python 命令后面。

8. ENV

设置环境变量,构建时和运行时都可以使用。

示例:

bash 复制代码
ENV APP_HOME /app

这行表示设置环境变量 APP_HOME 为 /app。

9. EXPOSE

声明容器暴露的端口,通常用于文档目的。

示例:

bash 复制代码
EXPOSE 8080

这行表示容器将暴露 8080 端口。

10. VOLUME

创建一个挂载点,指定将来容器运行时可以将宿主机目录挂载到该点。

示例:

bash 复制代码
VOLUME /data

这行表示在 /data 目录创建一个挂载点。

11. USER

指定运行后续命令的用户,默认为 root。

示例:

bash 复制代码
USER nobody

这行表示之后的命令将以 nobody 用户运行。

12. ARG

定义构建时的参数,可以在构建时通过 --build-arg 传递值。

示例:

bash 复制代码
ARG VERSION=1.0
RUN echo "Building version $VERSION"

这行表示定义了构建时的参数 VERSION,并在运行命令时使用它。

13. LABEL

添加元数据到镜像中,通常用于描述镜像信息。

示例:

bash 复制代码
LABEL maintainer="yourname@example.com"

这行表示为镜像添加了维护者信息。

14. HEALTHCHECK

指定容器的健康检查命令,以便 Docker 可以定期检查容器是否正常工作。

示例:

bash 复制代码
HEALTHCHECK CMD curl --fail http://localhost:8080/ || exit 1

这行表示每次运行 curl 命令检查服务状态,失败则认为容器不健康。

15. SHELL

指定后续 RUN 指令使用的 shell,默认是 /bin/sh -c。

示例:

bash 复制代码
SHELL ["/bin/bash", "-c"]

这行表示后续的 RUN 指令将使用 bash 来执行。

这些指令可以组合使用,定义出一个功能强大的 Dockerfile,帮助你构建所需的 Docker 镜像。

相关推荐
无奈笑天下8 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
Rabitebla12 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
火云代理12 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
威嵌神州12 小时前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
Decay__13 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
java_logo13 小时前
Docker 部署 DeepSeek Harness(moelin):轻松搭建带登录的本地 AI Agent 平台
运维·docker·容器·ai agent·deepseek·harness·轩辕镜像
火云代理15 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
坤坤子吖16 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
AI_Gump16 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
星恒随风18 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql