如何编写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
相关产品推荐
相关产品推荐

