dockerfile2-15
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 文件名 当前路径