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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:16:02