当前位置: 首页 > news >正文

Dockerfile:如何写一个Dockerfile文件?

如何写一个Dockerfile文件?

🚨推荐参考:Dockerfile:如何写一个Dockerfile文件?

现在的项目肯定都离不开docker,只要是流水线部署就会涉及Dockerfile文件,那么如何写一个正确的编写一个Dockerfile文件呢?

建议先熟悉一下Dockerfile的一些语法。

之后就是看案例:

前端项目(Nginx) DockerFile文件

  • Vue项目,涉及node安装依赖、build打包等操作。
# 使用 Node.js 镜像 , as build 别名构建阶段
FROM node:14 AS build
# 指定构建目录
WORKDIR /holmes-center-front
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装项目依赖
RUN npm install
# 将宿主机的所有文件,放到指定的WORKDIR工作目录里面来
COPY . .
# 执行 npm run build:prod 命令
RUN npm run build:prod# 使用官方的 Nginx 镜像
FROM nginx:latest
# 将宿主机的 nginx.conf 文件复制到容器中的 /etc/nginx/ 目录
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf
# 从第一build阶段获取dist下的文件移动到容器中的 /usr/share/nginx/html/ 目录
COPY --from=build /holmes-center-front/dist /usr/share/nginx/html/
# 暴露 Nginx 监听的端口,一般为 80,但这里因为是https协议所以要暴露443端口!
EXPOSE 443
# 启动 Nginx 服务
CMD ["nginx", "-g", "daemon off;"]

后端项目 DockerFile文件

  • SpringBoot项目,涉及mvn命令执行,启动jar包等。
# 选择构建用基础镜像。如需更换,请到[dockerhub官方仓库](https://hub.docker.com/_/java?tab=tags)自行选择后替换。
FROM maven:3.6.0-jdk-8-slim AS build
# 指定构建过程中的工作目录
WORKDIR /holmes-center-server
# 将src目录下所有文件,拷贝到工作目录中src目录下(.gitignore/.dockerignore中文件除外)
COPY holmes-admin /holmes-center-server/holmes-admin
COPY holmes-common /holmes-center-server/holmes-common
COPY holmes-framework /holmes-center-server/holmes-framework
COPY holmes-generator /holmes-center-server/holmes-generator
COPY holmes-quartz /holmes-center-server/holmes-quartz
COPY holmes-system /holmes-center-server/holmes-system
# 将pom.xml文件和settings.xml文件,拷贝到工作目录下
COPY settings.xml pom.xml /holmes-center-server/
# 自定义settings.xml, 选用国内镜像源以提高下载速度
RUN mvn -s /holmes-center-server/settings.xml -f /holmes-center-server/pom.xml clean package# 基础镜像
FROM  openjdk:8-jre
# author
MAINTAINER holmes
# 指定路径
WORKDIR /holmes-center-server
# 复制jar文件到路径
COPY --from=build /holmes-center-server/holmes-admin/target/*.jar .
# 启动认证服务
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","holmes-admin.jar"]

Redis DockerFile文件

# 基础镜像
FROM redis:5.0.10
MAINTAINER holmes# 挂载目录
VOLUME /home/holmes/redis
# 创建目录
RUN mkdir -p /home/holmes/redis
# 指定路径
WORKDIR /home/holmes/redis
# 复制conf文件到路径
COPY /docker/redis/redis.conf /home/holmes/redis/redis.conf
# 启动redis服务
ENTRYPOINT ["redis-server","/home/holmes/redis/redis.conf"]

下面就是说几个碰到的棘手的命令

COPY 指令 作用:很简单就是复制宿主机的文件到容器中

  • 如果添加了–from=xxx,那就不一样了,例如:
# 这个指的是复制宿主机中的/holmes/dist到/usr/share/nginx/html/中。
COPY /holmes/dist /usr/share/nginx/html/# 加上了--from=build,就是复制来自build阶段的/holmes-center-front/dist内容到/usr/share/nginx/html/下面,就不是宿主机了。
# 一般常用于多个阶段镜像构建当中,就和上面案例一样
COPY --from=build /holmes-center-front/dist /usr/share/nginx/html/
  • 如果没添加–from=xxx,第一个参数就是指定宿主机相关文件,第二个参数是指定容器相关文件的,不要混淆。为什么强调这个事情,因为,每次写dockerfile文件时,写着写着就混淆了,举个例子:
...
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装项目依赖
RUN npm install
# 将宿主机的所有文件,放到指定的WORKDIR工作目录里面来
COPY . .
# 执行 npm run build:prod 命令,这样容器中就有了dist压缩目录
RUN npm run build:prod# 前面我将dist包build出来了,但是第一印象却是用COPY来操作的,这就不对了。。。
# 错误案例:COPY dist /usr/share/nginx/html/ 这样他就去宿主机找dist文件,一般不会存在!# 正确应该是下面的执行mv,是容器内部执行命令才对。
RUN mv dist/* /usr/share/nginx/html/
# 如果涉及多个镜像阶段,那就通过--from=xxx来操作了。
  • " . " 代表当前目录下所有文件,例如:
# 指定构建目录
WORKDIR /holmes
# 将当前目录下所有文件,转移holmes目录
COPY . /holmes

RUN 指令:就是执行命令。灵活运用即可,有时候也可以执行 ls、pwd命令,排除一些错误等等。

相关文章:

Dockerfile:如何写一个Dockerfile文件?

如何写一个Dockerfile文件? 🚨推荐参考:Dockerfile:如何写一个Dockerfile文件? 现在的项目肯定都离不开docker,只要是流水线部署就会涉及Dockerfile文件,那么如何写一个正确的编写一个Dockerfil…...

Lua 中的高级特性:模块的使用、字符串模式匹配、高阶函数和表的元方法

### 1. 模块的使用 在 Lua 中,模块是一种封装代码的方式,使得代码可以被重用。下面是一个简单的模块定义和使用的示例: lua -- 定义一个名为 mymodule 的模块 mymodule {} function mymodule.sayHello() print("Hello from my mo…...

openssl3.2/test/certs - 040 - EC cert with named curve signed by named curve ca

文章目录 openssl3.2/test/certs - 040 - EC cert with named curve signed by named curve ca概述笔记END openssl3.2/test/certs - 040 - EC cert with named curve signed by named curve ca 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev…...

LabVIEW准分子激光器控制系统

LabVIEW准分子激光器控制系统是为了实现准分子激光光源在工业、医疗和科研领域的应用集成及其功能的扩展。系统由PC端和激光器端两部分构成,通过光隔离的RS232通讯连接,以实现稳定可靠的控制与通信。 系统主要由微控制单元(MCU)主…...

热血江湖服务端服务器架设教程

热血江湖服务端服务器架设教程 大家好,我是艾西今天简单的说下热血江湖架设需要哪些东西然后怎么操作,不管你是自己玩还是对外开放,这对于有兴趣的小伙伴总的都是一件好事。技多不压身就是这么个道理,当你需要用上时还希望能记起…...

美易平台:美元指数微幅回落

在最新的金融市场动态中,美元指数经历了0.5%的下跌,报告显示当前指数为103.03。这一变化对全球经济和货币市场产生了一定的影响。在这样的市场环境下,互联网金融券商如美易makeasy平台如何应对变化,并保持其服务质量和客户资产安全…...

编译和链接---C语言

引言 众所周知,C语言是一门高级的编程语言,是无法被计算机直接读懂的,C语言也不同于汇编PHP,无法直接翻译成机器语言,在学习的过程中,你是否好奇过我们所敲的C语言代码,是如何一步步翻译成机器…...

SAP EXCEL上传行数限制问题(ALSM_EXCEL_TO_INTERNAL_TABLE)

标准函数ALSM_EXCEL_TO_INTERNAL_TABLE上传EXCEL函数限制上限是9999行,如果上传数据记录数超过9999行的情况,需要拷贝标准的函数封装一个自定义的函数进行处理 标准的函数ROW的长度为4位,如下图所示 因此,如果想行数的位数超过4位…...

3.召回率-机器学习模型性能的常用的评估指标

在机器学习领域,召回率是一个关键的性能指标,用于评估模型在正样本中正确识别的能力。召回率的计算涉及到模型成功检测到的正样本数量与实际正样本的总数量之比。这个指标对于很多应用场景都至关重要,尤其是在那些要求较高的领域,…...

linux安装docker--更具官网教程

1.访问https://docs.docker.com/ 2.进入download 3输入cento 或者直接访问地址Install Docker Engine on CentOS | Docker Docs 4一步一步根据官网命令走 2安装 3 4 方式一: service docker start(开启) service docker status&#xff08…...

云原生安全:风险挑战与安全架构设计策略

概述 数字化转型已经成为当今最流行的话题之一,大部分企业已经开启自身的数字化转型之旅,在未来企业只有数字化企业和非数字化企业之分。通过数字经济的加速发展,可以有效推动企业数字化转型的步伐。云计算作为数字化转型的底座和重要的载体…...

c语言-文件的读写操作

文章目录 前言一、文件基础1.1 文件的分类1.2 文件路径和文件名 二、文件的打开和关闭2.1 文件指针2.2 文件的打开和关闭 总结 前言 本篇文章介绍c语言的文件读写操作。 一、文件基础 1.1 文件的分类 在c语言中,从文件的功能角度来看,文件可分为以下两…...

Python处理日期和时间库之arrow使用详解

概要 日期和时间处理是许多应用程序中的常见任务,但在 Python 中,标准库中的 datetime 模块有时可能会让这些任务变得复杂和繁琐。幸运的是,有一个名为 Arrow 的第三方库,它提供了简化日期和时间处理的功能,使其更加直…...

架构师之路(十四)计算机网络(网络层)

前置知识(了解):计算机基础。 作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 网络层提供主机…...

Spring Boot开发Spring Security

这里我对springboot不做过多描述&#xff0c;因为我觉得学这个的肯定掌握了springboot这些基础 导入核心依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐security</artifactId> </depen…...

gin介绍及helloworld

1. 介绍 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&#xff0c;容错方便等特点 对于golang而言&#xff0c;web框架的依赖要远比Python&#xff0c;Java之类的要小。自身的net/http足够简单&…...

vue3 自动引入 ref reactive...

npm i unplugin-auto-import -D vite.config.js import { defineConfig } from vite; import vue from vitejs/plugin-vue; import AutoImport from unplugin-auto-import/vite;export default defineConfig({plugins: [vue(),AutoImport({// 自动导入 Vue 相关函数&#xff0…...

软考复习之软件工程篇

软件生命周期 问题定义&#xff1a;要示系统分析员与用户进行交流&#xff0c;弄清”用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”&#xff0c;提交用户审查和确认 可行性研究&#xff1a;一方面在于把待开发的系统的目标以明确的语言描述出来&#xf…...

MySQL(七)MySQL和Oracle、PostgreSQL的区别

文章目录 一、MySQL和Oracle1.1 基本差别1.2 使用区别 二、MySQL和PostgreSQL2.1 基本差别2.2 使用差别 本系列文章&#xff1a; MySQL&#xff08;一&#xff09;SQL语法、数据类型、常用函数、事务 MySQL&#xff08;二&#xff09;MySQL SQL练习题 MySQL&#xff08;三&…...

(2)(2.4) CRSF/ELRS Telemetry

文章目录 前言 1 ArduPilot 参数编辑器 前言 &#xff01;Note ELRS&#xff08;ExpressLRS&#xff09;遥控系统使用穿越火线协议&#xff0c;连接方式类似。不过&#xff0c;它不像穿越火线那样提供双向遥测。 TBS CRSF 接收机与 ArduPilot 的接口中包含遥测和遥控信息。…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...