dockerFile文件编写

news/2024/12/20 9:14:36/文章来源:https://www.cnblogs.com/yansunda/p/18616413

因为是第一次学,所以写的有点繁琐,后面熟悉了之后可以删除掉繁琐的内容,留下精简的内容。

Dockerfile 是一个文本文件,包含了一系列指令,这些指令定义了如何构建一个 Docker 镜像。以下是编写 Dockerfile 的详细指南,涵盖了从基础到高级的各个方面。

1、创建Dockerfile文件

touch Dockerfile

在项目根目录下创建名为Dockerfile的文件,这个文件将包含所有用于构建镜像的指令,docker build的时候会用到它。

2、编写Dockerfile指令

以python web应用为例

2.1指定基础镜像(From)

每个Dockerfile必须以From指令开始,它指定了构建新镜像所基于的基础镜像。选择合适的基础镜像是非常重要的,因为它决定了你应用的运行环境。

# 使用官方 Python 运行时作为父镜像
From python:3.9-slim

2.2设置工作目录(WORKDIR)

使用 WORKDIR 指令设置容器内的工作目录。后续的命令如COPY 和 RUN 都会在这个目录中执行。使用docker exec 进入容器后也会默认进入该目录。

#设置工作目录为 /app
WORKDIR app/

2.3复制项目文件到容器(COPY 或 ADD)

使用COPY或ADD指令,将本地文件或者目录复制到容器内的指定位置。COPY更加明确高效,推荐优先使用。

#将当前目录的内容复制到容器的 /app 目录中
COPY . .

更加推荐使用COPY的原因如下:

 1、明确性:COPY 更加明确,用户一眼就能看出它只是简单地复制文件或目录,不会涉及其他复杂的操作。

 2、性能:由于 COPY 不执行额外的操作(如解压归档文件),因此通常比 ADD 更快

 3、可预测性:COPY 的行为更加可预测,减少了意外行为的可能性。

总结:

  COPY:当你需要简单的将文件或目录从主机复制到容器中时。

      ADD:   当你需要从远程URL获取文件、处理归档文件或者利用其更高级的功能时。

2.4安装依赖项

使用RUN指令执行命令通常用于安装软件包或者配置环境。为了优化镜像大小和构建速度,建议合并多个RUN指令,并清理不必要的文件。

# 更新软件包索引并安装所需的系统依赖项
RUN apt-get update && \apt-get install -y --no-install-recommends \libpq-dev \gcc \&& rm -rf /var/lib/apt/lists/*# 安装 Python 依赖项
RUN pip install --no-cache-dir -r requirements.txt

其中,requirements.txt是需要下载的python依赖。

2.5暴露端口(EXPOSE)

使用EXPOSE指令声明容器要运行时要监听的端口。这有助于文档化容器的服务端口,但实际的端口映射需要再运行时通过-p参数完成。

#暴露应用程序监听的端口
EXPOSE 5000

2.6设置环境变量(ENV)

使用ENV指令设置环境变量,可以在后续的RUN指令或启动容器后的进程中访问这些变量。

#设置环境变量
ENV FLASK_ENV=production

2.7定义默认命令(CMD)

#定义运行容器时执行的命令
CMD ["python", "app.py"]

2.8 入口点(ENTERPOINT)[可选]

如果你的应用程序有固定的启动命令,可以使用ENTRYPOINT 来定义不可变的入口点。CMD提供的参数会被追加到ENTRYPOINT后面作为参数传递。

# 如果需要固定启动命令,可以使用 ENTRYPOINT
# ENTRYPOINT ["flask", "run", "--host=0.0.0.0"]

语法:ENTRYPOINT ["executable", "param1", "param2"]

最佳实践

  • 保持层最小化:尽量减少RUN指令数量,合并多个指令为一个以减少镜像层数。
  • 多阶段构建:对于编译型语言,可以先在一个阶段中编译代码,然后将编译结果复制到另外一个
另:CMD和ENTERPOINT指令只能出现按一次,如果有多个,后面会覆盖前面的。

什么是多阶段构建:

多阶段构建(Multi-stage Build)是Docker提供的一种优化镜像构建的技术,它允许再一个Dockerfile中定义多个构建阶段。每个阶段可以使用不同的基础镜像,并且可以从一个阶段复制文件到另外一个阶段。这种技术的主要目的是为了创建更加精简、更安全的最终生产镜像,同时保持开发和构建过程中的灵活性。

多阶段构建的优势

  1. 减少镜像大小:通过只将必要的文件从构建阶段复制到最终镜像中,可以显著减小最终镜像的体积。
  2. 提高安全性:避免将编译工具和其他不必要的依赖项包含在最终镜像中,从而减少了潜在的安全风险。
  3. 简化构建过程:可以在一个 Dockerfile 中管理整个构建流程,包括编译、测试和打包等步骤。
  4. 更好的缓存利用:不同阶段可以独立缓存,使得重复构建更快。

多阶段构建的工作原理

在一个典型的多阶段构建过程中,Dockerfile 通常分为几个阶段:

  • 构建阶段:用于编译应用程序或生成静态资源。这一阶段通常基于包含所有必要开发工具的基础镜像。
  • 测试阶段(可选):用于运行单元测试或其他类型的测试。
  • 发布阶段:用于创建最终的生产就绪镜像。这一阶段通常基于一个较小的基础镜像,如 alpine 或者 scratch,并且只包含运行时所需的文件。

例如,以下是使用Go语音编写的简单Web应用程序,并希望利用Docker的多阶段构建来创建一个轻量级的生成镜像。

# 第一阶段:构建阶段
FROM golang:1.20-alpine AS builder# 设置工作目录
WORKDIR /app# 复制 go.mod 和 go.sum 文件并下载依赖包
COPY go.mod go.sum ./
RUN go mod download# 复制源代码并构建应用
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .# 第二阶段:发布阶段
FROM alpine:latest# 安装必要的运行时依赖(如果需要)
# RUN apk --no-cache add <dependencies># 设置工作目录
WORKDIR /root/# 从构建阶段复制生成的二进制文件
COPY --from=builder /app/myapp .# 暴露应用程序监听的端口
EXPOSE 8080# 定义启动命令
CMD ["./myapp"]

构建镜像:

docker build -t my-go-app .

运行容器:

docker run -d -p 8080:8080 my-go-app

这样,你就成功地使用了多阶段构建来创建了一个只包含应用程序二进制文件和必要运行时依赖的小型镜像。这种做法不仅减小了镜像大小,还提高了安全性,因为最终的镜像中不包含任何构建工具或源代码。

注意:

  在多阶段构建中,虽然 Dockerfile 中包含了多个 FROM 指令,但实际上并不会生成多个独立的 Docker 镜像。相反,这些 FROM 指令定义了不同的构建阶段,所有这些阶段最终会合并成一个最终的 Docker 镜像

  每个 FROM 指令标志着一个新的构建阶段开始,你可以在这个阶段中执行各种命令(如安装依赖、编译代码等)。每个阶段可以基于不同的基础镜像,并且可以在后续阶段中通过 COPY --from=<stage> 从之前的阶段复制文件。

例如,我们之前提到的 Go Web 应用

# 第一阶段:构建阶段
FROM golang:1.20-alpine AS builder# 设置工作目录、下载依赖、复制源代码并构建应用...# 第二阶段:发布阶段
FROM alpine:latest# 从构建阶段复制生成的二进制文件...
COPY --from=builder /app/myapp .# 暴露端口并定义启动命令...

第一阶段:使用 golang:1.20-alpine 来编译应用程序,但这个阶段不会成为最终镜像的一部分。

第二阶段:使用 alpine:latest 作为基础镜像,并从第一阶段复制编译好的二进制文件。这一阶段的结果才是最终的 Docker 镜像,它将被用来创建容器。

  当你运行 docker build 命令时,Docker 会依次处理每一个阶段,但最终只会输出最后一个阶段所定义的镜像。前面阶段的构建产物(如编译后的二进制文件)会根据需要被复制到后续阶段,但它们本身不会形成单独的镜像。因此,即使 Dockerfile 中有多个 FROM 指令,多阶段构建的结果仍然是一个单一的 Docker 镜像,这个镜像仅包含最后一个阶段指定的内容。

 

  
 
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855713.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

茶饮门店管理新篇章:板栗看板的实践与启示

茶饮企业可以通过板栗看板实现门店管理的优化和效率提升。从创建团队与看板、设置任务与分配、团队协作与沟通、进度跟踪与数据分析到优化与改进以及安全性能保障等方面入手,全面提升门店管理的水平和效率。近期,库迪咖啡以一种创新的“嵌入式”模式迅速扩展,其门店纷纷入驻…

修改网站首页排序,网站首页内容排序方法

修改网站首页内容的排序通常涉及以下几个步骤:登录后台:使用管理员账号登录网站后台。 找到内容管理:在后台导航中找到“内容管理”或“文章管理”。 编辑内容:选择需要排序的内容,点击“编辑”按钮。 设置排序:在编辑页面中,找到排序选项,设置内容的顺序。常见的排序方…

错误码:NET::ERR_CERT_AUTHORITY_INVALID,解决浏览器提示证书无效的问题

当您在访问某个网站时遇到“NET::ERR_CERT_AUTHORITY_INVALID”错误时,这意味着浏览器认为该网站的SSL证书不是由受信任的证书颁发机构(CA)签发的。这可能是由于多种原因造成的,包括证书过期、自签名证书、中间证书缺失等。以下是一些解决方法:检查证书颁发机构:确认证书…

PbootCMS在阿里云主机上邮件发送失败,提示“服务器已经禁用stream_socket_client和fsockopen函数”,如何解决?

当你在阿里云主机上使用PbootCMS时,如果遇到邮件发送失败,并且提示“服务器已经禁用stream_socket_client和fsockopen函数,请至少开启一个才能发送邮件!”的错误,这通常是因为阿里云主机的安全策略禁用了这些函数。以下是详细的解决步骤:登录阿里云管理后台:打开浏览器,…

高效与安全并重:高科技企业如何借助跨网文件交换系统实现双赢!

高科技企业在运营和发展过程中,会积累大量重要的核心数据,这些数据对于企业的技术创新、市场竞争优势以及商业机密保护至关重要。为了保障自身的信息安全、保护知识产权和核心数字资产,高科技企业通常会通过防火墙、网闸、虚拟化等方式,实施企业内网和外网隔离。实施网络隔…

南通知识付费分销系统搭建

图源 www.tuzhi.ltd在当前的教育和软件领域,知识付费模式正在逐渐普及,成为教育和培训行业的重要趋势之一。尤其在数字化转型的大潮中,在线教育系统的作用日益凸显,其为教学者和学习者之间的知识交流搭建了桥梁。以南通为例,当地的教育机构、老师甚至企业都纷纷尝试采用更…

使用STM32定时器输入捕获的一些记录

(最近在学习六步换相驱动直流无刷电机,记录一下其中陌生的定时器功能) 英文标识含义TIx:通道CHx的外部输入信号;霍尔传感器接口 霍尔传感器接口大概功能逻辑:将CH1~3的输入连接到异或器,输出TI1,实现同时对三个信号的边沿检测; TI1经过滤波、边沿检测 -> TI1F_ED信…

AI应用实战课学习总结(2)hello sk-learn

本文快速搭建了Python机器学习的开发环境,并通过一个简单的降维示例学习了scikit-learn的基本用法,完成了一个hello world程序。大家好,我是Edison。 最近入坑黄佳老师的《AI应用实战课》,记录下我的学习之旅,也算是总结回顾。 今天是我们的第2站,了解下scikit-learn框架…

好消息,在 Visual Studio 中可以免费使用 GitHub Copilot 了!

前言 今天大姚给大家分享一个好消息,GitHub Copilot 可以免费使用了!在此之前若开发者要使用 GitHub Copilot 需要付费订阅,每月订阅费用起步价为 10 美元,而经过验证的学生、教师和开源项目维护者则可以申请免费使用。今天咱们一起来看看在 Visual Studio 使用 GitHub Cop…

读图数据库实战笔记08遍历与子图

遍历与子图1. 使用熟路构建遍历 1.1. 为了避免把开发遍历和构建应用程序混淆1.1.1. 把遍历的编写和测试与应用程序的开发拆分成了两个独立的操作1.1.2. 在Java代码之外独立开发遍历,然后把它们加入应用程序中1.1.3. 现实情况是,大多数开发人员会同时完成两者,不管使用的是哪…

使用css实现圆形的头像的效果(注:要考虑正方形、长方形情况)

在前端开发中,我们经常需要将用户的头像显示为圆形。这可以通过CSS的 border-radius 属性来实现,该属性允许你设置元素的圆角。当 border-radius 设置为 50% 时,无论图片是正方形还是长方形,都会得到一个圆形的效果。但需要注意,长方形图片被裁剪为圆形时,会显示为椭圆形…

任意尺度图像超分辨率的基准技术分析

任意尺度图像超分辨率的基准技术分析 在计算机视觉领域,超分辨率(SR)一直是一个突出的研究领域。它的目的是从低分辨率(LR)图像重建高分辨率(HR)图像。最近,主要基于学习图像的连续表示的任意尺度图像SR取得了重大进展。 这些方法通常需要在特定范围内(即1.0-4.0)使用…