如何在Docker Compose中MongoDB初始化后执行Python脚本?
解决MongoDB初始化完成后执行数据导入脚本的问题
你的核心问题是用自定义entrypoint替换了MongoDB的默认启动流程,导致容器启动时直接运行Python脚本,而MongoDB根本没有启动,自然无法连接写入数据。下面提供两种可行的解决方案:
方案一:利用MongoDB官方镜像的初始化机制(推荐)
MongoDB官方镜像会在容器首次启动时,自动执行/docker-entrypoint-initdb.d/目录下的脚本,且这些脚本会在MongoDB初始化完成后运行。我们可以借助这个机制实现需求:
1. 编写启动脚本run_script.sh
创建一个shell脚本,用于等待MongoDB可用后执行Python数据导入脚本:
#!/bin/bash # 等待MongoDB服务就绪,支持认证 until mongosh -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval "db.adminCommand('ping')"; do echo "等待MongoDB初始化完成..." sleep 2 done # 执行数据导入脚本 python3 /docker-entrypoint-initdb.d/get_api_to_mongodb.py
2. 修改Dockerfile
将Python脚本和shell脚本复制到初始化目录,并赋予执行权限:
FROM mongo:latest RUN apt-get update -y && \ apt-get install python3-pip -y && \ pip3 install requests pymongo && \ apt-get clean -y && \ rm -rf /var/lib/apt/lists/* # 清理缓存减小镜像体积 # 将脚本复制到MongoDB初始化目录 COPY get_api_to_mongodb.py /docker-entrypoint-initdb.d/ COPY run_script.sh /docker-entrypoint-initdb.d/ RUN chmod +x /docker-entrypoint-initdb.d/run_script.sh
3. 修改docker-compose.yml
移除自定义entrypoint,使用MongoDB官方默认的启动流程:
version: '2.1' services: mongo: image: mongo_db build: mongo_image container_name: my_mongodb restart: always networks: - isolated_network ports: - "27017:27017" # 固定映射端口,方便本地访问 environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root_pw networks: isolated_network:
方案二:自定义entrypoint脚本控制启动流程
如果需要更灵活的控制,可以编写自定义entrypoint脚本,先启动MongoDB后台进程,等待初始化完成后执行数据导入,最后保持MongoDB前台运行:
1. 编写自定义entrypoint脚本entrypoint.sh
#!/bin/bash set -e # 后台启动MongoDB mongod --bind_ip_all & MONGO_PID=$! # 等待MongoDB服务就绪 until mongosh -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval "db.adminCommand('ping')"; do echo "等待MongoDB启动..." sleep 2 done # 执行数据导入脚本 python3 /tmp/script/get_api_to_mongodb.py # 等待MongoDB进程,保持容器运行 wait $MONGO_PID
2. 修改Dockerfile
复制脚本并设置为entrypoint:
FROM mongo:latest RUN apt-get update -y && \ apt-get install python3-pip -y && \ pip3 install requests pymongo && \ apt-get clean -y && \ rm -rf /var/lib/apt/lists/* RUN mkdir -p /tmp/script COPY get_api_to_mongodb.py /tmp/script/get_api_to_mongodb.py COPY entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"]
3. 修改docker-compose.yml
移除原entrypoint配置,使用Dockerfile中定义的自定义entrypoint即可。
内容的提问来源于stack exchange,提问作者Yunus Emrah Uluçay
相关产品推荐
相关产品推荐

