使用IDEA在WSL2的Ubuntu的docker中运行项目

1、新建项目

1.1 从远程仓库拉取代码

2、配置环境

2.1 配置IDEA运行环境

2.1.1 配置JDK

注意:Ubuntu 20.04运行项目请使用JDK11,使用JDK8会编译报错,报错如下:

2.1.2 配置Maven

2.1.3 配置运行环境

2.1.4 配置远程Debug

2.2、配置运行文件

2.2.1 pom.xml文件

<repositories>
        <!-- 配置阿里云镜像源 -->
        <repository>
            <id>aliyun</id>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <layout>default</layout>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <!-- 配置阿里云镜像源 -->
        <pluginRepository>
            <id>aliyun</id>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <layout>default</layout>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
 

2.2.2 Dockerfile文件

# 构建基础镜像阶段
FROM maven:3.9.6-eclipse-temurin-11 AS build

# 接收构建参数 【在docker-compose.yml中修改】
# 工作目录
ARG APP_DIR
# 构建后Jar包名称
ARG APP_NAME

# 设置工作目录
WORKDIR ${APP_DIR}

# 复制项目文件到工作目录
COPY . .

# 预先下载依赖并运行 Maven 构建命令
RUN mvn dependency:go-offline && \
    mvn clean compile package -DskipTests

# 运行基础镜像阶段
FROM openjdk:8-jre-alpine

# 接收构建参数 【在docker-compose.yml中修改】
# 工作目录
ARG APP_DIR
# 构建后Jar包名称
ARG APP_NAME
# 维护者信息
ARG MAINTAINER_INFO
# Remote Debug端口
ARG DEBUG_PORT

# 设置环境变量
ENV APP_DIR=${APP_DIR}
ENV APP_NAME=${APP_NAME}
ENV DEBUG_PORT=${DEBUG_PORT}

# 设置维护者信息
LABEL maintainer=${MAINTAINER_INFO}

# 设置容器时区为上海
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone

# 复制打包好的应用程序 JAR 文件到运行阶段镜像
COPY --from=build ${APP_DIR}/target/*.jar ${APP_DIR}/${APP_NAME}.jar

# 容器启动执行命令
ENTRYPOINT ["sh", "-c", "java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$DEBUG_PORT -jar $APP_DIR/$APP_NAME.jar"]



 

2.2.3 docker-compose.yml文件

version: '3.9'

services:
  backend:
    build:
      context: .  # 项目根目录
      dockerfile: Dockerfile  # Dockerfile 文件名
      args:
        APP_DIR: /code/greatsoft/healthmesh/healthmesh-wize # 设置 Dockerfile 中的工作目录
        APP_NAME: HealthDockerShowcase  # 设置 Dockerfile 中的jar包名称
        DEBUG_PORT: 5005 # 设置 Dockerfile 中的Remote Debug端口
        MAINTAINER_INFO: luzhiyong@greatsoft.net # 设置 Dockerfile 中的维护者信息
    ports:
      - "8190:8190"  # 将容器的 8190 端口映射到主机的 8190 端口
      - "5005:5005"  # 将容器的 5005 端口映射到主机的 5005 端口
    networks:
      - app_network
    depends_on:
      - database  # 依赖于 database 服务
      - nacos
      - redis
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://database:5432/postgres  # 设置数据库连接URL
      - SPRING_DATASOURCE_USERNAME=postgres
      - SPRING_DATASOURCE_PASSWORD=postgres

  database:
    image: postgres:15   # PostgreSQL 数据库的镜像
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres  # 设置数据库名称
    ports:
      - "5433:5432"  # 将容器的 5432 端口映射到主机的 5433 端口
    volumes:
      - postgres_data:/var/lib/postgresql/data  # 挂载数据卷到容器中的 PostgreSQL 数据目录
    networks:
      - app_network

  redis:
    image: redis:latest
    container_name: redis-server
    ports:
      - "6379:6379"
    networks:
      - app_network

  nacos:
    image: nacos/nacos-server:latest
    container_name: nacos-server
    ports:
      - "8848:8848"
    depends_on:
      - database  # 依赖于 database 服务
    environment:
      - MODE=standalone
    #      - SPRING_DATASOURCE_URL=jdbc:postgresql://database:5432/postgres  # 设置 Nacos 使用的数据库连接URL
    #      - SPRING_DATASOURCE_USERNAME=postgres
    #      - SPRING_DATASOURCE_PASSWORD=postgres
    #      - PREFER_HOST_MODE=hostname
    #      - spring.datasource.driver-class-name=org.postgresql.Driver
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

volumes:
  postgres_data:  # 定义一个名为 postgres_data 的数据卷

 

注意:若Dockerfile书写错误会出现build错误。

2.2.4 执行Shell脚本修改数据库用户名和密码

#!/bin/bash

# 设置数据库容器名称
DATABASE_CONTAINER_NAME="healthmesh-wize-database-1"

# 设置新的数据库用户名和密码
NEW_USERNAME="postgres"
NEW_PASSWORD="postgres"

# 读取 showcase.sql 文件的内容到变量
if [ -f "showcase.sql" ]; then
  SHOWCASE_SQL=$(cat showcase.sql)
else
  SHOWCASE_SQL=""
fi

# 函数:检查角色是否存在
role_exists() {
  local role=$1
  docker exec ${DATABASE_CONTAINER_NAME} psql -U postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='${role}'" | grep -q 1
}

# 函数:创建超级用户
create_superuser() {
  local role=$1
  local password=$2
  if ! role_exists "${role}"; then
    docker exec ${DATABASE_CONTAINER_NAME} psql -U postgres -c "CREATE ROLE ${role} WITH LOGIN SUPERUSER PASSWORD '${password}';"
  else
    echo "Role ${role} already exists. Skipping creation."
  fi
}

# 函数:修改数据库和用户密码
modify_db_user() {
  local db=$1
  local role=$2
  local password=$3
  docker exec ${DATABASE_CONTAINER_NAME} psql -U postgres -c "ALTER DATABASE ${db} OWNER TO ${role};"
  docker exec ${DATABASE_CONTAINER_NAME} psql -U postgres -c "ALTER USER ${role} WITH PASSWORD '${password}';"
}

# 检查是否已经存在数据库容器
if [[ "$(docker ps -aq -f name=${DATABASE_CONTAINER_NAME})" ]]; then
  echo "Database container already exists."
  docker-compose up -d ${DATABASE_CONTAINER_NAME}
  sleep 10
  docker exec ${DATABASE_CONTAINER_NAME} psql -U postgres -c "ALTER DATABASE postgres OWNER TO postgres;"
  sleep 10
  create_superuser "${NEW_USERNAME}" "${NEW_PASSWORD}"
  modify_db_user "postgres" "${NEW_USERNAME}" "${NEW_PASSWORD}"
else
  echo "Database container does not exist. Creating..."
  docker-compose up -d ${DATABASE_CONTAINER_NAME}
  sleep 10
  docker exec ${DATABASE_CONTAINER_NAME} psql -U postgres -c "ALTER DATABASE postgres OWNER TO postgres;"
  sleep 10
  create_superuser "${NEW_USERNAME}" "${NEW_PASSWORD}"
  modify_db_user "postgres" "${NEW_USERNAME}" "${NEW_PASSWORD}"

  # 当第一次执行时,执行 showcase.sql
  if [ ! -z "$SHOWCASE_SQL" ]; then
    echo "Executing showcase.sql..."
    docker exec -i ${DATABASE_CONTAINER_NAME} psql -U ${NEW_USERNAME} -d postgres <<EOF
$SHOWCASE_SQL
EOF
    echo "SQL execution finished."
  else
    echo "showcase.sql is empty or does not exist."
  fi
fi

# 更新 Docker Compose 配置文件中的数据库用户名和密码
sed -i.bak "s/POSTGRES_USER=.*/POSTGRES_USER=${NEW_USERNAME}/g" docker-compose.yml
sed -i.bak "s/POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=${NEW_PASSWORD}/g" docker-compose.yml

sed -i.bak "s/SPRING_DATASOURCE_USERNAME=.*/SPRING_DATASOURCE_USERNAME=${NEW_USERNAME}/g" docker-compose.yml
sed -i.bak "s/SPRING_DATASOURCE_PASSWORD=.*/SPRING_DATASOURCE_PASSWORD=${NEW_PASSWORD}/g" docker-compose.yml

# 更新 application.yml 中的数据库连接信息
sed -i.bak "s/username:.*/username: ${NEW_USERNAME}/g" ./src/main/resources/application.yml
sed -i.bak "s/password:.*/password: ${NEW_PASSWORD}/g" ./src/main/resources/application.yml

# 重新构建 Docker 容器
docker-compose down
docker-compose up -d

echo "Docker creation finished."

# 删除 Docker Compose 配置文件的备份
rm docker-compose.yml.bak
# 删除 application.yml 文件的备份
rm ./src/main/resources/application.yml.bak

echo "Backup files deleted."

 
 

2.2.5 远程Debug

Dockerfile编写启动命令

ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005", "-jar", "jar包", "--spring.profiles.active=test"]

映射两个端口

一个是服务端口,一个远程调试端口

3、构建运行

3.1 使用IDEA执行docker-compose

3.1.1 在本机安装 Docker Desktop,否则无法在IDEA运行docker-compose.yml

https://docs.docker.com/desktop/release-notes/

3.1.2 配置IDEA

3.2 使用IDEA执行Shell脚本修改数据库用户名和密码

3.2.1 IDEA配置运行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“两客一危”车辆综合监控信息化产品及应用分析

引言 随着科技的不断进步和社会的发展&#xff0c;“两客一危”车辆&#xff08;即长途客车、旅游包车和危险品运输车&#xff09;的安全监管问题日益凸显。为了提升车辆的安全性能和管理效率&#xff0c;综合监控信息化产品应运而生。本文将对这一产品进行详细介绍&#xff0…

【一百零一】【算法分析与设计】差分,1109. 航班预订统计,P4231 三步必杀,P5026 Lycanthropy

1109. 航班预订统计 这里有 n 个航班&#xff0c;它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings &#xff0c;表中第 i 条预订记录 bookings[i] [first(i), last(i), seats(i)] 意味着在从 first(i) 到 last(i) &#xff08;包含 first(i) 和 last(i) &#xff09;…

在Linux kali下载、安装Perl环境

目录 Perl介绍 下载安装 官网下载 在Windows安装 在Linux和Mac OS安装 Perl介绍 Perl一种功能丰富的计算机程序语言&#xff0c;运行在超过100种计算机平台上&#xff0c;适用广泛&#xff0c;从最初是为文本处理而开发的&#xff0c;现在用于各种任务&#xff0c;包括系统…

【Qt知识】Qt框架中的信号(Signals)与槽(Slots)机制

Qt框架中的信号&#xff08;Signals&#xff09;与槽&#xff08;Slots&#xff09;机制是一种强大的通信方式&#xff0c;允许对象之间相互通信而无需对象之间直接引用或了解对方。这一机制简化了应用程序的事件处理和组件之间的交互&#xff0c;是Qt的一大特色和核心概念。 …

【SQL学习进阶】从入门到高级应用【企业真题】

文章目录 第一题第二题第三题第四题第五题第六题第七题第八题第九题MySQL行转列使用case whengroup by完成 第十题 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f495;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01; &#x1f495;希望您在这…

【RuoYi】实现文件的上传与下载

一、前言 首先&#xff0c;最近在做一个管理系统&#xff0c;里面刚好需要用到echarts图和富文本编辑器&#xff0c;然后我自己去看了官网觉得有点不好懂&#xff0c;于是去B站看来很多视频&#xff0c;然后看到了up主【程序员青戈】的视频&#xff0c;看了他讲的echarts图和富…

社交媒体数据恢复:飞信

请注意&#xff0c;本教程只适用于飞信&#xff0c;并且不涉及推荐任何数据恢复软件。 一、备份飞信聊天记录 在开始恢复飞信聊天记录之前&#xff0c;我们建议您先备份现有的聊天记录。这样&#xff0c;即使恢复过程中出现问题&#xff0c;您也可以通过备份文件找回重要的聊…

搭建基于Django的博客系统增加广告轮播图(三)

上一篇&#xff1a;ChatGPT搭建博客Django的web网页添加用户系统&#xff08;二&#xff09; 下一篇&#xff1a;搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL&#xff08;四&#xff09; 功能概述 增加轮播图显示广告信息。 需求详细描述 1. 增加轮播图显示广告信…

python解决flask启动的同时启动定时任务

业务场景描述&#xff1a;在常规的开发中&#xff0c;我们开发接口服务&#xff0c;一般会将数据放在数据库、文件等第三方文件&#xff0c;启动服务后&#xff0c;服务到后台数据库中加载数据&#xff0c;这样做的好处当然是开发会更加便利以及数据的可复用性较高&#xff0c;…

一键实现文件夹批量高效重命名:轻松运用随机一个字母命名,让文件管理焕然一新!

在数字化时代&#xff0c;文件夹管理是我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着文件数量的不断增加&#xff0c;文件夹命名的繁琐和重复成为了一个让人头疼的问题。你是否曾因为手动一个个重命名文件夹而感到枯燥乏味&#xff1f;你是否曾渴望有一种方法能…

arm cortex-m架构 SVC指令详解以及其在freertos的应用

1. 前置知识 本文基于arm cortex-m架构描述&#xff0c; 关于arm cortex-m的一些基础知识可以参考我另外几篇文章&#xff1a; arm cortex-m 架构简述arm异常处理分析c语言函数调用规范-基于arm 分析 2 SVC指令 2.1 SVC指令位域表示 bit15 - bit12&#xff1a;条件码&#…

深入分析 Android BroadcastReceiver (一)

文章目录 深入分析 Android BroadcastReceiver (一)1. Android BroadcastReceiver 设计说明1.1 BroadcastReceiver 的主要用途 2. BroadcastReceiver 的工作机制2.1 注册 BroadcastReceiver2.1.1 静态注册2.1.2 动态注册 3. BroadcastReceiver 的生命周期4. 实现和使用 Broadca…

Android下HWC以及drm_hwcomposer普法(上)

Android下HWC以及drm_hwcomposer普法(上) 引言 按摩得全套&#xff0c;错了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果对Android图形栈有一定研究的童鞋们应该知道它是Android提供的一个的图形后端合成处理HAL模块的实现。但是在分析这个之前…

yolov8使用:数据格式转换(目标检测、图像分类)多目标跟踪

安装 yolov8地址&#xff1a;https://github.com/ultralytics/ultralytics git clone https://github.com/ultralytics/ultralytics.git安装环境&#xff1a; pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple目标检测 标注格式转换 若使用 labelimg…

sql注入-布尔盲注

布尔盲注&#xff08;Boolean Blind SQL Injection&#xff09;是一种SQL注入攻击技术&#xff0c;用于在无法直接获得查询结果的情况下推断数据库信息&#xff1b;它通过发送不同的SQL查询来观察应用程序的响应&#xff0c;进而判断查询的真假&#xff0c;并逐步推断出有用的信…

微服务学习Day9

文章目录 分布式事务seata引入理论基础CAP定理BASE理论 初识Seata动手实践XA模式AT模式TCC模式SAGA模式 高可用 分布式事务seata 引入 理论基础 CAP定理 BASE理论 初识Seata 动手实践 XA模式 AT模式 TCC模式 Service Slf4j public class AccountTCCServiceImpl implements A…

C语言 | Leetcode C语言题解之第126题单词接龙II

题目&#xff1a; 题解&#xff1a; char** list; int** back; int* backSize;// DFS uses backtrack information to construct results void dfs(char*** res, int* rSize, int** rCSizes, int* ans, int last, int retlevel) {int i ans[last];if (i 0) {res[*rSize] (c…

DALL·E 2详解:人工智能如何将您的想象力变为现实!

引言 DALLE 2是一个基于人工智能的图像生成模型&#xff0c;它通过理解自然语言描述来生成匹配这些描述的图像。这一模型的核心在于其创新的两阶段工作流程&#xff0c;首先是将文本描述转换为图像表示&#xff0c;然后是基于这个表示生成具体的图像。 下面详细介绍DALL-E2的功…

Vivado Design Suite一级物件

Vivado Design Suite一级物件 按设计过程导航内容 Xilinx文档围绕一组标准设计流程进行组织&#xff0c;以帮助您 查找当前开发任务的相关内容。本文件涵盖 以下设计过程&#xff1a; •硬件、IP和平台开发&#xff1a;为硬件创建PL IP块 平台&#xff0c;创建PL内核&#xff0…

HTML的标签(标题、段落、文本、图片、列表)

HTML的标签1 标题标签&#xff1a;段落标签&#xff1a;文本标签&#xff1a;图片标签:列表标签&#xff1a;有序列表&#xff1a;无序列表&#xff1a;定义列表&#xff1a;列表案例&#xff1a; 标题标签&#xff1a; 标签&#xff1a;h1~h6 注意&#xff1a;如果使用无效标…