【分享】记一次项目迁移(docker java | docker python)

项目:前端Vue3,后端Python+Java,数据库Redis+MySQL
原先部署在centos7里面的,使用的宝塔面板部署的,还算方便。
但是服务器要到期了,要将项目迁移到另外一台服务器。
另外一台服务器是opencloudos+1plane
本来想构建一个jdk1.8+python3.12+Nodejs环境的镜像
奈何本人没学过docker,操作起来有点困难。
于是决定
先创建一个基于centos的容器
然后在容器里面部署宝塔。
成功了倒是成功了,java项目与也跑起来了,可是……
python项目的包使用有问题,需要使用终端,也就是去连接ssh
但是docker里又没有权限使用ssh
于是我决定,一个一个的来部署
java项目一个容器
python项目一个容器
docker java
先编译成jar包,在本地测试运行,能正常运行
本地是windows,运行代码是
@echo off
echo.
echo [信息] 使用Jar命令运行Web工程。
echo.
cd %~dp0
cd ../ruoyi-admin/target
set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
java -jar %JAVA_OPTS% ruoyi-admin.jar
cd bin
pause
上传jar包到服务器,然后
根据上面的运行代码,编写Dockerfile文件
# 选择一个合适的基础镜像,这里使用OpenJDK 8的Alpine版本作为基础镜像来减小镜像大小
FROM openjdk:8-jdk-alpine
# 设置工作目录为/app
WORKDIR /app
# 将当前目录下的ruoyi-admin.jar复制到容器的/app目录下
COPY ./ruoyi-admin.jar /app/ruoyi-admin.jar
# 设置JVM参数
ENV JAVA_OPTS="-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
# 定义容器启动时执行的命令
ENTRYPOINT exec java $JAVA_OPTS -jar ruoyi-admin.jar
# 对外暴露的端口,如果您的应用使用了特定端口,请确保此处声明(例如:EXPOSE 8080)
# EXPOSE 端口号
然后创建镜像
docker build -t miao_sign_manage_server:v1 .
不要忘了后面有个点

然后 1plane上看到有镜像了,再根据这个镜像去创建容器


java这边就完成了。接下里就是python了,这玩意就有点麻烦,主要是包麻烦
python docker
导出依赖包
pip install pipreqs
pipreqs ./

先上传项目,然后vim Dockerfile
# 使用官方提供的Python运行时作为父镜像
FROM python:3.12
# 设置在容器内的工作目录为/app
WORKDIR /app
# 将当前目录内容复制到容器的/app中
ADD . /app
# 设置pip使用阿里云镜像
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ \
&& pip config set install.trusted-host mirrors.aliyun.com
# 安装任何需要的包
RUN pip install --no-cache-dir -r requirements.txt
# 对外暴露的端口号(如果您的Flask应用程序运行在不同的端口上,请相应更改)
EXPOSE 5000
# 设置环境变量
ENV NAME miao_run_server
# 容器启动时运行python app.py
CMD ["python", "app.py"]
换源这事很重要,不然容易超时错误
基本上能把包顺利装全,就没啥问题了
docker java 巨坑
高高兴兴运行项目,开局就系统错误,加载不了验证码,原因是:
从你提供的日志中,可以看出你在请求 '/captchaImage' 地址时遇到了一个 NullPointerException 异常。这个异常通常表示你试图访问或操作一个为 null 的对象。从堆栈跟踪中,这个异常发生在 sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264),这似乎是Java的AWT库在尝试加载或读取字体配置时遇到的问题。
这个问题可能是由于以下几个原因造成的:
字体配置文件缺失或损坏:Java可能无法找到或正确读取系统的字体配置文件,这可能是由于文件缺失、损坏或权限问题导致的。你可以尝试检查系统的字体配置,或者重新安装Java以修复可能的文件损坏。
环境问题:如果你在一个无头(headless)环境中运行你的应用(例如,一个没有图形用户界面的服务器),那么Java可能无法正确初始化它的图形子系统。你可以尝试通过设置 java.awt.headless=true 系统属性来运行你的应用,以告诉Java你正在一个无头环境中运行。你可以在启动Java应用时添加 -Djava.awt.headless=true 到命令行参数中来实现这一点。
代码问题:虽然从堆栈跟踪中看不出具体的代码问题,但是如果你的代码在请求 '/captchaImage' 时尝试做了与字体或图形相关的操作,那么你可能需要检查这些代码以确保它们在没有图形环境的情况下也能正确运行。特别是,你应该避免在没有检查是否为 null 的情况下调用对象的方法或访问其属性。
请注意,由于堆栈跟踪并没有显示你的代码,所以我只能根据提供的信息做出一些猜测。如果以上的建议不能解决你的问题,或者你需要更具体的帮助,那么你可能需要提供更多的信息,例如你的代码片段或更详细的错误日志。
看AI回答,大概意思就是因为我的是无图形界面的,所有加载某些东西的时候出了问题
于是我修改了一下Dockerfile
# 选择一个合适的基础镜像,这里使用OpenJDK 8的Alpine版本作为基础镜像来减小镜像大小
FROM openjdk:8-jdk-alpine
# 设置容器时间与宿主时间一致
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 设置工作目录为/app
WORKDIR /app
# 安装fontconfig插件
RUN apk update && apk add fontconfig
RUN fc-cache --force
# 将当前目录下的ruoyi-admin.jar复制到容器的/app目录下
COPY ./ruoyi-admin.jar /app/ruoyi-admin.jar
# 设置JVM参数,并添加-Djava.awt.headless=true
ENV JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
# 为了提高随机数生成速度,可以通过以下方式设置(可选)
# ENV JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
# 定义容器启动时执行的命令
ENTRYPOINT exec java $JAVA_OPTS -jar ruoyi-admin.jar
# 对外暴露的端口,确保与应用实际使用的端口一致(例如:EXPOSE 8080)
# EXPOSE 端口号
可是并没有解决问题
我只能尝试在镜像做好后再去安装
docker ps
docker exec -it 939234e551c9 /bin/sh
apk update && apk add fontconfig
apk add --update font-adobe-100dpi ttf-dejavu fontconfig
等等……这玩意下载那么久,要是每次都这么折腾我得死。
于是
宿主机 yum install fontconfig
再次修改Dockerfile
# 选择一个合适的基础镜像,这里使用OpenJDK 8的Alpine版本作为基础镜像来减小镜像大小
FROM openjdk:8-jdk-alpine
# 设置容器时间与宿主时间一致
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 设置工作目录为/app
WORKDIR /app
# 安装fontconfig插件
#RUN apk update && apk add fontconfig
#RUN fc-cache --force
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
# 将当前目录下的ruoyi-admin.jar复制到容器的/app目录下
COPY ./ruoyi-admin.jar /app/ruoyi-admin.jar
# 设置JVM参数,并添加-Djava.awt.headless=true
ENV JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
# 为了提高随机数生成速度,可以通过以下方式设置(可选)
# ENV JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
# 定义容器启动时执行的命令
ENTRYPOINT exec java $JAVA_OPTS -jar ruoyi-admin.jar
# 对外暴露的端口,确保与应用实际使用的端口一致(例如:EXPOSE 8080)
# EXPOSE 端口号
问题解决
# 选择一个合适的基础镜像,这里使用OpenJDK 8的Alpine版本作为基础镜像来减小镜像大小
FROM openjdk:8-jdk-alpine
# 设置容器时间与宿主时间一致
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 设置工作目录为/app
WORKDIR /app
# 安装fontconfig插件
#RUN apk update && apk add fontconfig
#RUN fc-cache --force
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
# 将当前目录下的ruoyi-admin.jar复制到容器的/app目录下
COPY ./ruoyi-admin.jar /app/ruoyi-admin.jar
# 设置JVM参数,并添加-Djava.awt.headless=true
ENV JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
# 为了提高随机数生成速度,可以通过以下方式设置(可选)
# ENV JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
# 定义容器启动时执行的命令
ENTRYPOINT exec java $JAVA_OPTS -jar ruoyi-admin.jar
# 对外暴露的端口,确保与应用实际使用的端口一致(例如:EXPOSE 8080)
# EXPOSE 端口号
至于前端的话,vue编译后,直接以静态文件的方式运行即可。
如果用了反代理,记得配置反代理

对了,如果你的项目涉及文件读写,本地保存数据的话,因为是在docker里面的,所有要考虑一下数据持久化的事情。
【分享】记一次项目迁移(docker java | docker python)的更多相关文章
- 在eclipse中用java调用python报错 Exception in thread "main" ImportError: Cannot import site module and its dependencies
最近做项目需要用java调用python,配置了jython后,运行了例子代码: 获得一个元组里面的元素: import org.python.util.PythonInterpreter; publ ...
- 从零开始部署发布Java项目到服务器的Docker中
本以为很简单,由于没用过docker和java,本文将会阐述一路遇到的拦路虎. 首先,写好Java项目,本地跑通. 可能会遇到的问题: 1.jar包正常运行,war包404: 如何打包很多教程都有介绍 ...
- 记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策
在经过了两年的准备,以及迁移了几个应用项目积累了让我有信心的经验之后,我最近在开始将团队里面最大的一个项目,从 .NET Framework 4.5 迁移到 .NET 6 上.这是一个从 2016 时 ...
- 微服务开发有道之把项目迁移到Kubernetes上的5个小技巧
我们将在本文中提供5个诀窍帮你将项目迁移到Kubernetes上,这些诀窍来源于过去12个月中OpenFaas社区的经验.下文的内容与Kubernetes 1.8兼容,并且已经应用于OpenFaaS ...
- Docker如何部署Python项目
Docker 部署Python项目 作者:白宁超 2019年5月24日09:09:00 导读: 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如 ...
- Android官方技术文档翻译——IntelliJ 项目迁移
本文译自Android官方技术文档<Migrating from IntelliJ Projects>,原文地址:http://tools.android.com/tech-docs/ne ...
- 最近整理出了有关大数据,微服务,分布式,Java,Python,Web前端,产品运营,交互等1.7G的学习资料,有视频教程,源码,课件,工具,面试题等等。这里将珍藏多年的资源免费分享给各位小伙伴们
大数据,微服务,分布式,Java,Python,Web前端,产品运营,交互 领取方式在篇尾!!! 基础篇.互联网架构,高级程序员必备视频,Linux系统.JVM.大型分布式电商项目实战视频...... ...
- docker微服务部署之:四、安装docker、docker中安装mysql和jdk1.8、手动构建镜像、部署项目
docker微服务部署之:三,搭建Zuul微服务项目 1.Centos7安装Docker 详见:Centos7安装Docker 2.Docker中安装jdk1.8 详见:使用Docker构建jdk1. ...
- .NET项目迁移到.NET Core操作指南
为什么要从.NET迁移到.NET Core? .NET Core提供的特性 .NET Core性能提升 .NET如何迁移到.NET Core? 迁移工作量评估(API兼容性分析) 迁移方案制定 通过类 ...
- Tomcat因项目迁移,启动窗口一闪而过,启动失败的解决办法。
笔者手动部署一个web项目到Tomcat/webapps/目录下,成功运行.后来,项目结束,我把webapps下的姓项目文件夹删除.重启Tomcat时,运行...\apache-tomcat-8.5. ...
随机推荐
- mysql-存储过程(二)-逻辑判断语句
一,if语句: IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为e ...
- 使用Git LFS上传大文件步骤
1.首先我们要先下载git lfs.链接地址 2.我们需要安装git lfs,但是必须安装到git/bin下面.就是你安装git的时候,那个路径.可以看我的git安装路径: 3.我们可以使用以下步 ...
- 各位Oracle DBA们,你们期待的在线实训环境终于来了
各位Oracle DBA,你们是否曾在学习.工作时遇到不得不上正式库测试的情况,如果没事发生那一切岁月静好,但若一不小心删了用户.删了表甚至删了库,可就是悲剧了--从做出开库测试这个决定起,胆战心惊就 ...
- 墨天轮最受DBA欢迎的数据库技术文档-容灾备份篇
在大家的支持与认可下,墨天轮编辑部继续为大家整理出了[墨天轮最受欢迎的技术文档]系列第二篇--容灾备份篇,希望能够帮助到大家. 作为一名数据库管理员,最怕数据库中心突然失去服务能力.影响业务,而不论是 ...
- 2021CSP复赛游记,总结与回顾
一曲起,一曲落:2021的CSP复赛也走过一个月了. 总而言之,成败只代表过去,过去不代表未来,收获满满,受益匪浅,足矣 今年,是我参加CSP的第四年,回忆当初踏入信息学的大门,跌倒过,受伤过,但从没 ...
- JOI 2020 Final
A - 長いだけのネクタイ (Just Long Neckties) JOI 公司开了一个派对.有 \(n + 1\) 条领带,第 \(i\) 条领带的长度是 \(a_i\).有 \(n\) 名员工, ...
- node.js安装及环境配置基于Windows系统
node.js安装及环境配置-Windows系统 1. 下载安装包 https://nodejs.org/zh-cn/download/ 根据自己电脑系统及位数选择,我的电脑是Windows系统.64 ...
- nosql的衍生与数据库的拆分
nosql简单介绍 Redis:开源.免费.非关系型数据库.K-V数据库.内存数据库,支持持久化.事务和备份,集群(支持16个库)等高可用功能.并且性能极高(可以达到100000+的QPS),易扩展, ...
- 记录EntityFramework增删改产生的SQL语句
项目里遇到一个数据交换的需求,申报端和审批端的系统和数据库都不在同一个网段:甲方提供一个msmq队列:我们把申报和审批产生的变化数据用sql记录到xml报文中,通过交换xml文件再解析出sql语句来实 ...
- ESP8266 + MQTT + 土壤湿度传感器
ESP8266 + MQTT + 土壤湿度传感器 连线 #include <Arduino.h> #include <Ticker.h> #include <ESP826 ...