使用IDEA在WSL2的Ubuntu的docker中运行项目
·
项目代码:https://gitee.com/haosishiguren/wsl-docker-wize.git,创作不易,请给一个star作为激励
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
# 环境配置文件路径
ARG ENV_CONFIG_PATH
# Spring profiles active
ARG SPRING_PROFILES_ACTIVE
# 设置环境变量
ENV APP_DIR=${APP_DIR}
ENV APP_NAME=${APP_NAME}
ENV DEBUG_PORT=${DEBUG_PORT}
ENV ENV_CONFIG_PATH=${ENV_CONFIG_PATH}
ENV SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
# 设置维护者信息
LABEL maintainer=${MAINTAINER_INFO}
# 设置容器时区为上海
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone
# 创建并设置工作目录
RUN mkdir -p ${APP_DIR}
# 复制预置的文件到临时位置
COPY ./src/main/resources/custom /tmp/custom
COPY ./src/main/resources/db-init /tmp/db-init
COPY ./src/main/resources/application.yml /tmp/config/application.yml
COPY ./src/main/resources/application-dev.yml /tmp/config/application-dev.yml
COPY ./src/main/resources/application-test.yml /tmp/config/application-test.yml
COPY ./src/main/resources/application-prod.yml /tmp/config/application-prod.yml
# 复制打包好的应用程序 JAR 文件到运行阶段镜像
COPY --from=build ${APP_DIR}/target/*.jar ${APP_DIR}/lib/${APP_NAME}.jar
# 创建脚本 复制初始文件到挂载目录(如果挂载目录为空)
RUN echo '#!/bin/sh' > /entrypoint.sh && \
echo '[ "$(ls -A ${APP_DIR}/custom)" ] || cp -r /tmp/custom/* ${APP_DIR}/custom/' >> /entrypoint.sh && \
echo '[ "$(ls -A ${APP_DIR}/db-init)" ] || cp -r /tmp/db-init/* ${APP_DIR}/db-init/' >> /entrypoint.sh && \
echo '[ -f ${APP_DIR}/config/application.yml ] || cp /tmp/config/application.yml ${APP_DIR}/config/application.yml' >> /entrypoint.sh && \
echo '[ -f ${APP_DIR}/config/application-dev.yml ] || cp /tmp/config/application-dev.yml ${APP_DIR}/config/application-dev.yml' >> /entrypoint.sh && \
echo '[ -f ${APP_DIR}/config/application-test.yml ] || cp /tmp/config/application-test.yml ${APP_DIR}/config/application-test.yml' >> /entrypoint.sh && \
echo '[ -f ${APP_DIR}/config/application-prod.yml ] || cp /tmp/config/application-prod.yml ${APP_DIR}/config/application-prod.yml' >> /entrypoint.sh && \
echo 'exec java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$DEBUG_PORT -jar $APP_DIR/lib/$APP_NAME.jar' >> /entrypoint.sh && \
chmod +x /entrypoint.sh
# 容器启动执行命令
ENTRYPOINT ["/entrypoint.sh"]
2.2.3 docker-compose.yml文件
version: '3.9'
services:
healthmesh-wize:
build:
context: . # 项目根目录
dockerfile: Dockerfile # Dockerfile 文件名
args:
APP_DIR: /opt/healthmesh/wize # 设置 Dockerfile 中的工作目录
APP_NAME: HealthmeshWize # 设置 Dockerfile 中的jar包名称
DEBUG_PORT: 5005 # 设置 Dockerfile 中的Remote Debug端口
MAINTAINER_INFO: luzhiyong@greatsoft.net # 设置 Dockerfile 中的维护者信息
SPRING_PROFILES_ACTIVE: dev
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
volumes:
- /opt/healthmesh/wize/config:/opt/healthmesh/wize/config
- /opt/healthmesh/wize/custom:/opt/healthmesh/wize/custom
- /opt/healthmesh/wize/db-init:/opt/healthmesh/wize/db-init
database:
image: postgres:15 # PostgreSQL 数据库的镜像
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres # 设置数据库名称
ports:
- "5433:5432"
volumes:
- /opt/healthmesh/wize/data:/var/lib/postgresql/data
- /opt/healthmesh/wize/db-init:/docker-entrypoint-initdb.d
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"
- "9848:9848"
- "9849:9849"
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
注意:若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配置运行

项目代码:https://gitee.com/haosishiguren/wsl-docker-wize.git,创作不易,请给一个star作为激励
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)