Dockerfiles 的 Top 10 常见 DevOps/SRE 面试问题及答案

news/2025/2/12 11:46:49/

1. RUN 和 CMD 之间有什么区别?

  • RUN : 在镜像构建过程中执行命令,创建一个新的层。通常用于安装软件包。

    示例:

    dockerfile">RUN apt-get update && apt-get install -y curl
    
  • CMD : 指定容器启动时默认运行的命令。它在运行时执行,而不是在构建过程中。

    示例:

    dockerfile">CMD ["node", "app.js"]
    

2. 如何在 Dockerfile 中使用多阶段构建?

多阶段构建允许你在 Dockerfile 中使用多个 FROM 语句来创建临时阶段,这有助于保持最终镜像更小。

示例:

dockerfile"># Build stage
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp# Production stage
FROM alpine:latest
COPY --from=builder /app/myapp /myapp
CMD ["/myapp"]

3. EXPOSE 指令的目的是什么?

  • EXPOSE : 记录容器在运行时监听的端口。它不发布端口,但为运行容器的用户提供提示。
  • 要使端口可访问,请使用 -p 标志与 docker run

示例:

dockerfile">EXPOSE 8080

4. ARG 和 ENV 有什么区别?

  • ARG :定义一个变量,用户可以在构建时通过 docker build --build-arg 传递。它在运行时不可用。

    示例:

    dockerfile">ARG VERSION=1.0
    RUN echo $VERSION
    ENV NODE_ENV=production
    
  • ENV : 设置在构建时和运行时都可用环境变量。

    示例:

    ENV NODE_ENV=production
    

5. 如何优化 Docker 镜像的大小?

  • 使用多阶段构建来分离构建依赖项和运行时依赖项。

    示例:

    dockerfile"># Build stage
    FROM node:14 AS build
    WORKDIR /app
    COPY package.json ./
    RUN npm install
    COPY . .# Production stage
    FROM node:14-alpine
    WORKDIR /app
    COPY --from=build /app .
    CMD ["node", "app.js"]
    
  • RUN 语句中组合命令以减少层数。

    示例:

    dockerfile">RUN apt-get update && apt-get install -y curl git
    
  • 使用更小的基础镜像,如 Alpine,以最小化镜像大小。

6. 如何在容器重启后持久化数据?

使用 Docker 卷或绑定挂载来持久化容器文件系统之外的数据。这确保即使容器被重新启动或重新创建,数据仍然可用。

示例:

docker run -v mydata:/data myapp

7. LABEL 指令的目的是什么?

LABEL : 向图像添加元数据,例如维护者信息、版本或描述。这有助于图像的文档编制和管理。

示例:

dockerfile">LABEL maintainer="you@example.com" version="1.0" description="A sample app"

8. 为什么你可能会在 Dockerfile 中使用 HEALTHCHECK?

HEALTHCHECK : 定义一个命令以测试容器是否正常运行。如果健康检查失败,Docker 可以自动重启容器或采取其他纠正措施。

示例:

dockerfile">HEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost/ || exit 1

9. 如何在 Dockerfile 中处理秘密信息?

避免在 Dockerfile 中硬编码秘密。相反,使用 Docker secrets、环境变量或像 HashiCorp Vault 这样的外部工具来安全地管理敏感信息。

示例:

dockerfile">ENV API_KEY=${API_KEY}

10. CMD 和 ENTRYPOINT 有什么区别?

  • CMD : 为执行中的容器提供默认值。可以通过传递参数给 docker run 来覆盖。

    示例:

    dockerfile">CMD ["nginx", "-g", "daemon off;"]
    
  • ENTRYPOINT :配置容器以可执行文件形式运行。与 docker run 一起提供的命令和参数将附加到 ENTRYPOINT 指令中。

    示例:

    dockerfile">ENTRYPOINT ["nginx"]
    CMD ["-g", "daemon off;"]
    

http://www.ppmy.cn/news/1571408.html

相关文章

Java+vue前后端分离项目集群部署

一、项目概述 假设我们有一个前后端分离的项目,前端使用React或Vue框架,后端使用Spring Boot或Node.js。我们将分别部署前端和后端到集群环境中。 二、准备工作 1. 代码准备:确保前端和后端代码已经开发完成,并通过本地测试。 2…

USB子系统学习(四)用户态下使用libusb读取鼠标数据

文章目录 1、声明2、HID协议2.1、描述符2.2、鼠标数据格式 3、应用程序4、编译应用程序5、测试6、其它 1、声明 本文是在学习韦东山《驱动大全》USB子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。 韦老师的《驱动大全》:商…

MyBatis-Plus-Join (MPJ) 框架介绍

MyBatis-Plus-Join (MPJ) 框架介绍 MyBatis-Plus-Join (MPJ) 是一个基于 MyBatis-Plus 的多表关联查询框架,它提供了一种优雅的方式来处理复杂的表关联查询。 主要特性 Lambda 式查询 wrapper.selectAs(Teacher::getId, TeacherLeaveVO::getTeacherId).leftJoin(C…

4.python+flask+SQLAlchemy+达梦数据库

前提 1.liunx Centos7上通过docker部署了达梦数据库。从达梦官网下载的docker镜像。(可以参考前面的博文) 2.windows上通过下载x86,win64位的达梦数据库,只安装客户端,不安装服务端。从达梦官网下载达梦数据库windows版。(可以参考前面的博文) 这样就可以用windows的达…

cuda学习资料汇总

一 gemm 1.1 ampere 1.2 hopper 1.2.1 github中的使用cutlass和wgmma cutlass/examples/cute/tutorial/wgmma_sm90.cu at main NVIDIA/cutlass GitHub 1.2.2 TMA (1)TMA cutlass

二、Golang Channel通信和控制题目

要求 采用Golang语言中channel实现协程间的通讯,并通过控制channel控制起输入与输出格式。其中一个协程sender负责发送字符串"ABC"的字符,另一个协程reciever负责接收这些字符并打印。 要求接收方reciever协程能够按照顺序,按照行…

解决 idea 无法创建java8 模版

解决 idea 无法创建java8 模版 由于 Spring 官方不再维护 旧的版本了导致的 https://start.spring.io 解决方式很简单 切换到 阿里源就可以了 https://start.aliyun.com/ 项目生成 成功 总结 :IDEA 内置的 Spring Initializr 创建 Spring Boot 项目实际上是依赖官…

【CubeMX-HAL库】STM32F407—无刷电机学习笔记

目录 简介: 学习资料: 跳转目录: 一、工程创建 二、板载LED 三、用户按键 四、蜂鸣器 1.完整IO控制代码 五、TFT彩屏驱动 六、ADC多通道 1.通道确认 2.CubeMX配置 ①开启对应的ADC通道 ②选择规则组通道 ③开启DMA ④开启ADC…