dockerfile2-15

发布于:2025-02-17 ⋅ 阅读:(111) ⋅ 点赞:(0)

dockerfile

一、什么是dockerfile

1.1 dockerfile是创建镜像所有指令的文本文件,包含了一条条指令和说明,每条指令构建一层,通过docker build的命令,根据dockerfile的内容构建镜像,因此每一条指令的内筒就是描述该层如何构建,有了dockerfile,就可以制定自己的镜像规则,只需要在dockerfile上添加或者修改指令,就可生成docker 镜像

在这里插入图片描述

1.2docker容器,dockerfile,docker镜像的关系

dockerfile:是面向开发的,发布项目做镜像的时候就要西那些dockerfile文件

dockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品

docker容器:容器就是镜像运行起来提供服务的

二、dockerfile的基本指令

1.1dockerfile的指令选项

# ================== 基础指令 ==================
# 指定基础镜像(必须为第一条指令)
# 格式: FROM [--platform=<平台>] <镜像名>[:<标签>] [AS <构建阶段名>]
FROM ubuntu:22.04 AS builder

# ================== 元数据指令 ==================
# 维护者信息(已废弃,推荐用 LABEL 替代)
MAINTAINER John Doe <john@example.com>

# 设置镜像元数据(推荐方式)
LABEL maintainer="John Doe <john@example.com>"
LABEL version="1.0" description="My Application"

# ================== 构建环境指令 ==================
# 设置环境变量(整个构建过程和容器运行时生效)
# 格式: ENV <key>=<value> ...
ENV APP_HOME=/app \
    NODE_ENV=production

# 构建阶段临时变量(仅在构建过程中生效)
ARG DEBIAN_FRONTEND=noninteractive

# ================== 文件操作指令 ==================
# 切换工作目录(自动创建不存在路径)
WORKDIR $APP_HOME

# 复制本地文件到镜像(严格1:1复制,推荐首选)
COPY ./src ./src
COPY package.json ./

# 高级复制(支持URL和解压,非必要不推荐)
ADD https://example.com/data.tar.gz /tmp/
ADD configs.tar.gz ./configs/

# ================== 构建过程指令 ==================
# 执行Shell命令(合并减少镜像层)
RUN apt-get update && \
    apt-get install -y python3-pip && \
    rm -rf /var/lib/apt/lists/*

# ================== 运行时配置指令 ==================
# 声明容器运行时端口(仍需通过-p映射)
EXPOSE 80/tcp 443

# 定义数据卷挂载点(推荐运行时通过-v挂载)
VOLUME ["/data", "/logs"]

# 指定运行用户(需提前创建用户)
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser:appuser

# ================== 启动指令 ==================
# 入口点指令(不可被覆盖,通常与CMD配合使用)
ENTRYPOINT ["python3"]

# 默认启动参数(可被docker run覆盖)
CMD ["app.py"]

# ================== 高级指令 ==================
# 触发器指令(当本镜像被其他Dockerfile继承时执行)
ONBUILD COPY . /app
ONBUILD RUN make build

# 健康检查(Docker 1.12+)
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/health || exit 1

# 停止信号(指定容器停止时发送的信号)
STOPSIGNAL SIGTERM

常见误区修正
CMD vs ENTRYPOINT

当同时存在时,CMD 作为 ENTRYPOINT 的参数

示例:ENTRYPOINT ["echo"] + CMD ["Hello"] = 输出 "Hello"

COPY vs ADD

优先使用 COPY,仅在需要以下功能时用 ADD:

自动解压 .tar, .gz 等归档文件

从 URL 下载文件(不推荐,建议用 RUN curl)

ONBUILD 陷阱

触发时机:子镜像的 FROM 之后立即执行

典型用途:基础镜像预配置(如自动复制代码)

(自己找的指令,感觉不够好,然后利用ai补充了一下)

1、2 常见误区修正

1、CMD vs ENTRPOINT

  • 当两个同时存在的时候,CMD做为ENTRPOINT的参数
  • 示例ENTRYPOINT["echo"]+CMD["hello"] =输出“hello”

2、COPY vs ADD

  • 优先使用COPY,仅在需要以下功能时,用ADD

  • 自动解压.tar,.gz等归档文件

  • 从url下载文件(不推荐,建议使用RUN curl1)

  • ONBUILD 陷阱

FROM nginx:1.22
RUN echo "this is nginx" > /usr/share/nginx/html/index,html
EXPOSE 80
CMD["nginx"  "-g" "daemon off."]

这是一个很简单的dockerfile文件

将文件运行一下docker build -f 文件名 当前路径

在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到