You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写shell脚本实现Docker-Compose镜像构建及容器启动流程

可用Shell脚本及实现说明

完整可直接修改使用的脚本

#!/bin/bash

# 自定义配置项,使用前请根据实际场景修改
MONGO_CONTAINER_NAME="mongo"
MONGO_DATABASE="your_target_db"
MONGO_COLLECTION="your_target_collection"
JSON_FILE_DIR="./seed_json"
MONGO_MAX_WAIT_SEC=30

# 第一步:执行Docker Compose镜像构建
echo "Start building Docker images..."
if ! docker compose build; then
    echo "Error: Docker image build failed, process terminated."
    exit 1
fi

# 第二步:启动容器集群
echo "Image build success, starting containers..."
docker compose up -d

# 等待MongoDB服务就绪,避免提前导入报错
echo "Waiting for MongoDB service to be available..."
wait_count=0
until docker exec ${MONGO_CONTAINER_NAME} mongosh --eval "db.adminCommand('ping')" >/dev/null 2>&1
do
    if [ ${wait_count} -ge ${MONGO_MAX_WAIT_SEC} ]; then
        echo "Error: MongoDB failed to start within ${MONGO_MAX_WAIT_SEC} seconds."
        docker compose down
        exit 1
    fi
    sleep 2
    wait_count=$((wait_count+2))
done

# 第三步:逐文件导入JSON数据
echo "MongoDB is ready, starting data seeding..."
for json_file in "${JSON_FILE_DIR}"/*.json
do
    # 跳过不存在的匹配项
    [ -e "$json_file" ] || continue
    echo "Loading file: ${json_file}"
    # 导入命令二选一:如果本地安装了mongo-tools,可直接用本地命令连接暴露的Mongo端口
    # if ! mongoimport --uri "mongodb://127.0.0.1:27017/${MONGO_DATABASE}" --collection ${MONGO_COLLECTION} --file "${json_file}" --jsonArray; then
    # 无本地工具可直接在Mongo容器内执行,需提前在docker-compose.yml中将JSON_FILE_DIR挂载到容器的/seed路径
    if ! docker exec ${MONGO_CONTAINER_NAME} mongoimport --db ${MONGO_DATABASE} --collection ${MONGO_COLLECTION} --file "/seed/$(basename ${json_file})" --jsonArray; then
        echo "Error: Failed to load JSON file ${json_file}"
        docker compose down
        echo "Could not start Docker service because there was a problem seeding the DB."
        exit 1
    fi
done

echo "All processes finished successfully, services are running normally."

核心逻辑说明

  • 镜像构建结果校验:docker compose build执行完成后会返回标准Linux进程退出码,0代表执行成功,非0代表执行失败,脚本中直接通过if ! docker compose build即可捕获失败状态,无需额外校验逻辑。
  • 导入失败文件名输出:脚本采用逐文件遍历导入的逻辑,每个JSON文件单独执行导入操作,一旦某条导入命令返回非0退出码,直接打印当前正在处理的文件路径即可定位问题文件。

使用注意事项

  • 若使用容器内导入的方式,需要在docker-compose.yml的Mongo服务配置中增加volumes挂载,将本地存放JSON文件的目录映射到容器的/seed路径。
  • 如果导入的JSON不是数组格式,去掉导入命令中的--jsonArray参数即可。

内容的提问来源于stack exchange,提问作者Jolurado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:24:03