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(…...
云原生安全:风险挑战与安全架构设计策略
概述 数字化转型已经成为当今最流行的话题之一,大部分企业已经开启自身的数字化转型之旅,在未来企业只有数字化企业和非数字化企业之分。通过数字经济的加速发展,可以有效推动企业数字化转型的步伐。云计算作为数字化转型的底座和重要的载体…...
c语言-文件的读写操作
文章目录 前言一、文件基础1.1 文件的分类1.2 文件路径和文件名 二、文件的打开和关闭2.1 文件指针2.2 文件的打开和关闭 总结 前言 本篇文章介绍c语言的文件读写操作。 一、文件基础 1.1 文件的分类 在c语言中,从文件的功能角度来看,文件可分为以下两…...
Python处理日期和时间库之arrow使用详解
概要 日期和时间处理是许多应用程序中的常见任务,但在 Python 中,标准库中的 datetime 模块有时可能会让这些任务变得复杂和繁琐。幸运的是,有一个名为 Arrow 的第三方库,它提供了简化日期和时间处理的功能,使其更加直…...
架构师之路(十四)计算机网络(网络层)
前置知识(了解):计算机基础。 作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 网络层提供主机…...
Spring Boot开发Spring Security
这里我对springboot不做过多描述,因为我觉得学这个的肯定掌握了springboot这些基础 导入核心依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐security</artifactId> </depen…...
gin介绍及helloworld
1. 介绍 Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点 对于golang而言,web框架的依赖要远比Python,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 相关函数࿰…...
软考复习之软件工程篇
软件生命周期 问题定义:要示系统分析员与用户进行交流,弄清”用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”,提交用户审查和确认 可行性研究:一方面在于把待开发的系统的目标以明确的语言描述出来…...
MySQL(七)MySQL和Oracle、PostgreSQL的区别
文章目录 一、MySQL和Oracle1.1 基本差别1.2 使用区别 二、MySQL和PostgreSQL2.1 基本差别2.2 使用差别 本系列文章: MySQL(一)SQL语法、数据类型、常用函数、事务 MySQL(二)MySQL SQL练习题 MySQL(三&…...
(2)(2.4) CRSF/ELRS Telemetry
文章目录 前言 1 ArduPilot 参数编辑器 前言 !Note ELRS(ExpressLRS)遥控系统使用穿越火线协议,连接方式类似。不过,它不像穿越火线那样提供双向遥测。 TBS CRSF 接收机与 ArduPilot 的接口中包含遥测和遥控信息。…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
