目次
dockerfile是一种用于定义和构建docker镜像的文本文件,由一行行指令和参数组成,用于形貌镜像的构建和设置过程;由基础映像、软件包安装、文件拷贝、环境变量设置等组成; 基于dockerfile构建镜像可以使用docker build下令,使用 -f 可以指定具体的dockerfile文件; 使用dockerfile构建镜像的步骤如下:编写dockerfile文件-->docker build构建镜像-->docker run运行镜像; Dockerfile概述Dockerfile文件需放置在一个目次中,这个目次中有构建镜像的所有文件,是本次执行的上下文路目次(可以明确为docker根目次),可以创建子目次。 DockerFile镜像的指令和参数Dockerfile 是一个文本文件,它包含了用于构建 Docker 镜像的一系列指令和参数。以下是 Dockerfile 的常见结构和组成部分:
DockerFile镜像案例[code]# 使用基础镜像,这是构建新镜像的起点 FROM ubuntu:20.04 AS base # 维护者信息(使用 LABEL 替代 MAINTAINER) LABEL maintainer="Name <email>" # 设置环境变量,这会影响后续的RUN指令以及容器运行时的环境 ENV MY_ENV_VAR="my_value" ENV PATH="/usr/local/bin:${PATH}" # RUN 指令执行下令并创建一个新的镜像层,用于安装软件包 RUN apt-get update && apt-get install -y \ curl \ git \ vim # 工作目次 :WORKDIR 设置工作目次,后续的RUN、CMD、ENTRYPOINT指令都会基于这个工作目次 WORKDIR /app # 复制当前目次内容到容器内的 /app 目次下,COPY 从构建上下文(通常为Dockerfile地点的目次)复制新文件或目次到镜像中 COPY . /app # 添加额外的文件到镜像中:ADD 与COPY雷同,但可以处理tar压缩文件,并且可以执行一些特殊使用 ADD ./files/* /app/files/ # 定义一个挂载点:VOLUME 定义一个挂载点,用于数据长期化或容器间数据共享 VOLUME /var/log/myapp # EXPOSE 声明容器运行时监听的端口 EXPOSE 8000 # 指定容器启动时执行的下令:CMD 指令提供容器启动时执行的默认下令,可以被docker run的参数覆盖 CMD ["python", "/app/main.py"] # 构建阶段:编译应用,使用多阶段构建来减小终极镜像的大小 FROM base AS builder RUN apt-get update && apt-get install -y build-essential COPY --from=base /app /app RUN make /app # 生产阶段:运行应用,使用基础镜像作为构建产物的运行环境 FROM base AS production COPY --from=builder /app/bin /app/bin CMD ["/app/bin/myapp"] # 健康查抄: HEALTHCHECK 定义容器的健康查抄下令,提高容器的可靠性 HEALTHCHECK --interval=30s --timeout=30s --retries=3 \ CMD curl -f http://localhost:8000 || exit 1 # 用户:USER 指定运行下令的用户和用户组,提高安全性 USER 1000:1000 # 构建缓存:ARG 定义构建缓存的变量,可以用于构建过程中的参数传递 ARG BUILD_DATE LABEL org.label-schema.build-date=$BUILD_DATE # 制止信号:STOPSIGNAL 设置制止容器的信号,可以是任何POSIX制止信号或数字 STOPSIGNAL SIGTERM # 使用 SHELL 指令 :SHELL 指定用于执行指令的shell,可以是bash、sh等 SHELL ["/bin/bash", "-c"][/code]表明基础镜像: 使用 [code]ubuntu:20.04[/code] 作为基础镜像。 维护者信息: 使用 [code]LABEL[/code] 替代已废弃的 [code]MAINTAINER[/code]。 环境变量: 设置环境变量 [code]MY_ENV_VAR[/code] 和更新 [code]PATH[/code]。 更新和安装软件: 使用 [code]RUN[/code] 安装软件包。 工作目次: 设置工作目次为 [code]/app[/code]。 复制文件: 使用 [code]COPY[/code] 和 [code]ADD[/code] 将文件添加到镜像中。 挂载点: 定义一个挂载点。 暴露端口: 声明容器运行时监听的端口。 默认下令: 设置容器启动时执行的默认下令。 构建阶段: 使用 [code]builder[/code] 阶段编译应用。 生产阶段: 使用 [code]production[/code] 阶段运行应用。 健康查抄: 定义容器的健康查抄下令。 用户: 指定运行下令的用户。 构建缓存: 使用 [code]ARG[/code] 定义构建时的变量。 制止信号: 设置制止容器的信号。 SHELL: 指定用于执行指令的 shell。 下令具体说明基础镜像指令 ([code]FROM[/code]) [code]FROM ubuntu:20.04[/code][code]FROM[/code] 指令指定了基础镜像,这是构建新镜像的基础。 维护者指令 ([code]MAINTAINER[/code]) (可选,已废弃,建议使用 LABEL) [code]LABEL maintainer="name <email>"[/code][code]LABEL[/code] 用于添加元数据,替代了以前的 [code]MAINTAINER[/code] 指令。 环境变量指令 ([code]ENV[/code]) [code]ENV PATH /usr/local/bin:$PATH[/code][code]ENV[/code] 用于设置环境变量。 工作目次指令 ([code]WORKDIR[/code]) [code]WORKDIR /app[/code][code]WORKDIR[/code] 设置容器内的当前工作目次。 复制指令 ([code]COPY[/code] 和 [code]ADD[/code]) [code]COPY . /app[/code][code]COPY[/code] 从构建上下文复制新文件或目次到容器的文件体系。 [code]ADD[/code] 与 [code]COPY[/code] 雷同,但处理归档文件时有额外的功能。 运行指令 ([code]RUN[/code]) [code]RUN apt-get update && apt-get install -y nginx[/code][code]RUN[/code] 指令用于执行下令,并将其结果(如安装的软件)作为新的镜像层生存。 暴露指令 ([code]EXPOSE[/code]) [code]EXPOSE 80[/code][code]EXPOSE[/code] 指令关照 Docker 守护进程容器运行时监听的端口。 启动下令指令 ([code]CMD[/code]) [code]CMD ["nginx", "-g", "daemon off;"][/code][code]CMD[/code] 指令指定了容器启动时执行的默认下令。 健康查抄指令 ([code]HEALTHCHECK[/code]) [code]HEALTHCHECK --interval=30s --timeout=30s --retries=3 CMD curl -f http://localhost || exit 1[/code][code]HEALTHCHECK[/code] 指令用于指定如何查抄容器健康状态。 构建缓存指令 ([code]ARG[/code]) [code]ARG VERSION=latest[/code][code]ARG[/code] 指令用于定义构建过程中的变量。 多阶段构建 ([code]FROM[/code] 在 Dockerfile 中多次使用) [code]# 第一阶段: 构建阶段 FROM golang:1.16 AS builder WORKDIR /app COPY go.* ./ RUN go mod download COPY . . RUN go build -o /my-go-app # 第二阶段: 生产环境 FROM alpine:latest RUN apk add --no-cache ca-certificates WORKDIR /root COPY --from=builder /my-go-app . CMD ["./my-go-app"][/code]使用多阶段构建可以减小终极镜像的大小,将构建产物从构建阶段复制到生产环境镜像。 DockerFile实战案例1:Spring Boot应用项目结构假设我们的Spring Boot应用结构如下: [code]springbootapp/ ├── src/ │ ├── main/ │ │ ├── java/com/ │ │ │ └── example/ │ │ │ ├── controller/ │ │ │ │ └── HelloController.java │ │ │ └── Application.java │ │ └── resources/ │ │ └── application.properties ├── pom.xml └── Dockerfile [/code][code]HelloController.java[/code] 是Spring Boot控制器。 [code]Application.java[/code] 是Spring Boot应用的主步调。 [code]application.properties[/code] 包含应用设置。 [code]pom.xml[/code] 是Maven构建设置文件。 Dockerfile[code]# 使用官方Java基础镜像,带有Maven环境,用于构建项目 FROM maven:3.8.1-jdk-11 AS build # 设置工作目次 WORKDIR /app # 复制项目文件到容器中 COPY src ./src COPY pom.xml . # 使用Maven构建项目 RUN mvn -f pom.xml clean package # 使用官方Java基础镜像,用于运行应用 FROM openjdk:11-jre-slim # 设置工作目次 WORKDIR /app # 从构建阶段复制已构建的jar文件到运行阶段 COPY --from=build /app/target/*.jar ./app.jar # 暴露端口 EXPOSE 8080 # 运行Spring Boot应用 CMD ["java", "-jar", "app.jar"][/code]构建和运行Docker镜像构建镜像: [code]docker build -t springbootapp .[/code]运行容器: [code]docker run -p 8080:8080 springbootapp[/code]DockerFile实战案例2:Spring Boot和MyBatis多模块项目项目结构多模块Spring Boot和MyBatis应用结构如下: [code]multimoduleapp/ ├── pom.xml ├── Dockerfile └── app/ ├── common/ │ ├── pom.xml │ └── src/ │ ├── main/ │ └── java/ │ └── com/ │ └── example/ │ └── common/ │ └── CommonService.java ├── api/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── api/ │ │ │ └── ApiController.java │ │ └── resources/ │ └── application.properties └── service/ ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── service/ │ │ │ └── BusinessService.java │ │ └── resources/ └── src/ └── main/ └── resources/ └── mapper/ └── UserMapper.xml [/code][code]CommonService.java[/code] 是一个通用服务。 [code]ApiController.java[/code] 是Spring Boot控制器。 [code]BusinessService.java[/code] 是业务逻辑服务。 [code]UserMapper.xml[/code] 是MyBatis映射文件。 [code]pom.xml[/code] 是Maven构建设置文件。 Dockerfile[code]# 使用官方Java基础镜像,带有Maven环境,用于构建项目 FROM maven:3.8.1-jdk-11 AS build # 设置工作目次 WORKDIR /app # 复制项目文件到容器中 COPY . . # 使用Maven构建项目 RUN mvn -f pom.xml clean package # 使用官方Java基础镜像,用于运行应用 FROM openjdk:11-jre-slim # 设置工作目次 WORKDIR /app # 从构建阶段复制已构建的jar文件到运行阶段 COPY --from=build /app/api/target/*.jar ./app.jar # 暴露端口 EXPOSE 8080 # 运行Spring Boot应用 CMD ["java", "-jar", "app.jar"][/code]构建和运行Docker镜像构建镜像: [code]docker build -t multimoduleapp .[/code]运行容器: [code]docker run -p 8080:8080 multimoduleapp[/code]总结到此这篇关于docker使用dockerfile构建镜像的文章就介绍到这了,更多相关dockerfile构建docker镜像内容请搜索脚本之家以前的文章或继续欣赏下面的相关文章渴望各人以后多多支持脚本之家! 来源:https://www.jb51.net/server/3283408kr.htm 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-7-1 19:13 , Processed in 0.031634 second(s), 18 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.