docker部署
安装镜像
# 官方镜像
docker pull mongo:4.4
docker compose
docker-compose.yaml
通过下方的build.sh
来调用本配置文件
# 本文件需要配合build.sh使用
# 需要重新获取当前项目用户
# 使用docker部署容易发生权限问题
# 通过指定USER_GID和USER_UID来修复数据库文件挂载后的权限问题
networks:
TyphoonUI:
name: TyphoonUI
driver: bridge
external: true
ipam:
driver: default
config:
- subnet: 173.25.0.0/24
services:
TyphoonUI-mongodb:
image: mongo:4.4
container_name: TyphoonUI-mongodb
user: "${CURRENT_UID}:${CURRENT_GID}"
networks:
TyphoonUI:
ipv4_address: 173.25.0.101
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
volumes:
- ${APP_PATH}/db:/app
- ${APP_PATH}/docker/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js
command: mongod --config /app/mongodb.yaml
privileged: true
ports:
- "27018:27017"
build.sh
# !/bin/bash
# @Author: CPS
# @email: 373704015@qq.com
# @Date: 2025-02-21 10:17:02.552941
# Last Modified by: CPS
# Last Modified time: 2025-02-21 10:16:45.670965
# Modified time: 2025-02-21 10:16:45.670965
# @file_path "W:\CPS\MyProject\gis-api\docker\typhoon"
# @Filename "build.sh"
# @Description "通过docker-compose来创建一个mongodb,关联mongo:4.4镜像"
NETWORK_NAME='TyphoonUI'
DB_NAME='typhoon'
DB_USER_NAME='typhoon'
DB_PASSWORD='typhoon.123'
# 指定 Docker Compose 文件路径(根据实际情况修改)
DOCKER_COMPOSE_FILE="docker-compose.yaml"
# 获取当前用户的用户名
CURRENT_USER=$(whoami)
# 获取当前用户的UID和GID
CURRENT_UID=$(id -u "$CURRENT_USER")
CURRENT_GID=$(id -g "$CURRENT_USER")
APP_PATH=/home/typhoon/app
DB_PATH=/home/typhoon/app/db
MONGO_INITDB_ROOT_USERNAME=admin
MONGO_INITDB_ROOT_PASSWORD=admin.typhoon
# 将UID和GID设置为全局环境变量
export CURRENT_UID CURRENT_GID APP_PATH MONGO_INITDB_ROOT_USERNAME MONGO_INITDB_ROOT_PASSWORD
# 创建一个临时的 .env 文件
ENV_FILE=".env"
# 导入依赖函数
# source ./utils.sh
# 【依赖函数】=======================================================
# 检查并创建目录的函数
check_and_create_dir() {
local dir_path="$1"
if [ ! -d "$dir_path" ]; then
echo "路径 $dir_path 不存在,正在创建..."
mkdir -p "$dir_path"
if [ $? -eq 0 ]; then
echo "路径 $dir_path 创建成功"
else
echo "创建路径 $dir_path 失败,脚本退出"
exit 1
fi
else
echo "路径 $dir_path 已存在"
fi
}
# 复制文件的函数
copy_file() {
local src_file="$1"
local dest_file="$2"
if [ -f "$src_file" ]; then
cp "$src_file" "$dest_file"
if [ $? -eq 0 ]; then
echo "文件 $src_file 已成功复制到 $dest_file"
else
echo "复制文件 $src_file 到 $dest_file 失败"
exit 1
fi
else
echo "源文件 $src_file 不存在,无法复制"
exit 1
fi
}
# 检查文件是否存在的函数
check_file_exists() {
local file_path="$1"
if [ ! -f "$file_path" ]; then
echo "文件 $file_path 不存在"
return 1
else
echo "文件 $file_path 已存在"
return 0
fi
}
# 删除文件的函数
delete_file() {
local file_path="$1"
if [ -f "$file_path" ]; then
rm -f "$file_path"
if [ $? -eq 0 ]; then
echo "文件 $file_path 删除成功"
else
echo "删除文件 $file_path 失败"
exit 1
fi
else
echo "文件 $file_path 不存在,无法删除"
fi
}
# 【依赖函数】=======================================================
# 调用函数检查文件是否存在
if ! check_file_exists "$DOCKER_COMPOSE_FILE"; then
echo "$DOCKER_COMPOSE_FILE 文件不存在"
exit
else
echo "开始执行脚本,创建基于compose的mongodb"
fi
exit
# 写入环境变量到 .env 文件
echo "CURRENT_UID=$CURRENT_UID" > "$ENV_FILE"
echo "CURRENT_GID=$CURRENT_GID" >> "$ENV_FILE"
echo "APP_PATH=$APP_PATH" >> "$ENV_FILE"
echo "MONGO_INITDB_ROOT_USERNAME=$MONGO_INITDB_ROOT_USERNAME" >> "$ENV_FILE"
echo "MONGO_INITDB_ROOT_PASSWORD=$MONGO_INITDB_ROOT_PASSWORD" >> "$ENV_FILE"
# 写入init-mongo.js数据初始化文件
echo "var dbname = \"$DB_NAME\"" > "init-mongo.js"
echo "var username = \"$DB_USER_NAME\"" >> "init-mongo.js"
echo "var passwd = \"$DB_PASSWORD\"" >> "init-mongo.js"
echo "var db = db.getSiblingDB(dbname);" >> "init-mongo.js"
echo "var currentTime = new Date();" >> "init-mongo.js"
echo "var currentTimeBeijing = new Date(currentTime.getTime() + (8 * 60 * 60 * 1000));" >> "init-mongo.js"
echo "db.createCollection(\"init\")" >> "init-mongo.js"
echo "db.init.insert({\"init_time_UTC\":currentTime, \"init_time_Beijing\":currentTimeBeijing })" >> "init-mongo.js"
echo "db.createUser({user:username,pwd:passwd,roles:[{role:\"dbOwner\",db:dbname}]})" >> "init-mongo.js"
# 【检查目录】=======================================================
# 检查 APP_PATH 是否存在,如果不存在则创建
check_and_create_dir "$APP_PATH"
check_and_create_dir "$DB_PATH"
check_and_create_dir "$DB_PATH/data"
check_and_create_dir "$DB_PATH/log"
# 创建配置文件
echo "systemLog:" > $DB_PATH/mongodb.yaml
echo " destination: file" >> $DB_PATH/mongodb.yaml
echo " path: \"/app/log/mongodb.log\"" >> $DB_PATH/mongodb.yaml
echo " logAppend: true" >> $DB_PATH/mongodb.yaml
echo "storage:" >> $DB_PATH/mongodb.yaml
echo " journal:" >> $DB_PATH/mongodb.yaml
echo " enabled: true" >> $DB_PATH/mongodb.yaml
echo " dbPath: \"/app/data\"" >> $DB_PATH/mongodb.yaml
echo "processManagement:" >> $DB_PATH/mongodb.yaml
echo " fork: false" >> $DB_PATH/mongodb.yaml
echo "net:" >> $DB_PATH/mongodb.yaml
echo " port: 27017" >> $DB_PATH/mongodb.yaml
echo " bindIp: 0.0.0.0" >> $DB_PATH/mongodb.yaml
# 检查 APP_PATH 是否存在,如果不存在则创建
if [ ! -d "$APP_PATH" ]; then
echo "路径 $APP_PATH 不存在,正在创建..."
mkdir -p "$APP_PATH"
if [ $? -eq 0 ]; then
echo "路径 $APP_PATH 创建成功"
else
echo "创建路径 $APP_PATH 失败,脚本退出"
exit 1
fi
else
echo "路径 $APP_PATH 已存在"
fi
# 检查 APP_PATH 是否存在,如果不存在则创建
if [ ! -d "$APP_PATH" ]; then
echo "路径 $APP_PATH 不存在,正在创建..."
mkdir -p "$APP_PATH"
if [ $? -eq 0 ]; then
echo "路径 $APP_PATH 创建成功"
else
echo "创建路径 $APP_PATH 失败,脚本退出"
exit 1
fi
else
echo "路径 $APP_PATH 已存在"
fi
# 【检查网络】=======================================================
# 检查指定网络是否存在
docker network inspect "$NETWORK_NAME" &>/dev/null
# 如果返回非零状态,表示网络不存在
if [ $? -ne 0 ]; then
echo "网络 $NETWORK_NAME 不存在,正在创建网络..."
docker network create --subnet=173.25.0.0/24 "$NETWORK_NAME"
if [ $? -eq 0 ]; then
echo "网络 $NETWORK_NAME 创建成功"
else
echo "创建网络 $NETWORK_NAME 失败,脚本退出"
exit 1
fi
else
echo "网络 $NETWORK_NAME 已经存在"
fi
# 【检查配置】=======================================================
# 执行 docker compose config,检查配置文件是否有效
docker compose config &>/dev/null
if [ $? -eq 0 ]; then
echo "docker compose 配置有效,正在启动服务..."
docker compose up -d
if [ $? -eq 0 ]; then
echo "docker compose 服务启动成功"
else
echo "docker compose 服务启动失败"
exit 1
fi
else
echo "docker compose 配置无效,请检查配置文件"
exit 1
fi
delete_file "$ENV_FILE"
delete_file "init-mongo.js"
chmod +x build.sh
./build.sh