如何防止Docker Compose中的Minio MC容器执行命令后退出
解决MinIO MC容器执行初始化后自动退出的问题
容器执行完初始化命令就退出,核心原因是容器的主进程(这里是/bin/sh)在脚本执行完毕后就会终止,即使移除exit 0也没用。要让容器保持运行,需要让主进程持续处于活跃状态,以下是几种可行方案:
方案一:在初始化脚本末尾添加阻塞命令
修改ready_minio的entrypoint,在所有初始化命令后添加tail -f /dev/null——这个命令会持续读取空设备,让进程一直处于运行状态:
ready_minio: image: minio/mc env_file: - ./envs/local.env entrypoint: > /bin/sh -c " until (/usr/bin/mc config host add myminio http://minio:9000 minio minio123) do echo '...waiting...' && sleep 1; done; /usr/bin/mc alias set myminio http://minio:9000 minio minio123; /usr/bin/mc admin user add myminio/ $${MINIO_ACCESS_KEY} $${MINIO_SECRET_KEY}; /usr/bin/mc admin policy set myminio/ readwrite user=$${MINIO_ACCESS_KEY}; /usr/bin/mc mb myminio/$${MINIO_MEDIA_FILES_BUCKET}; /usr/bin/mc policy set public myminio/$${MINIO_MEDIA_FILES_BUCKET}; tail -f /dev/null; " depends_on: - minio
修改后启动容器,初始化完成后会保持存活,你可以正常用docker exec -it ready_minio /bin/sh进入执行命令。
方案二:拆分初始化与常驻容器
如果不需要每次启动mc容器都重复执行初始化逻辑,可以把初始化和常驻功能拆成两个服务:
- 一个一次性容器负责执行初始化,完成后自动退出
- 另一个常驻容器保持运行,供你随时进入操作
修改后的docker-compose.yaml示例:
version: '3' services: minio: image: minio/minio command: server --address 0.0.0.0:9000 --console-address 0.0.0.0:9001 /data volumes: - minio-data:/data expose: - 9000 ports: - "9001:9001" environment: MINIO_ROOT_USER: minio MINIO_ROOT_PASSWORD: minio123 # 一次性初始化容器 minio_init: image: minio/mc env_file: - ./envs/local.env entrypoint: > /bin/sh -c " until (/usr/bin/mc config host add myminio http://minio:9000 minio minio123) do echo '...waiting...' && sleep 1; done; /usr/bin/mc alias set myminio http://minio:9000 minio minio123; /usr/bin/mc admin user add myminio/ $${MINIO_ACCESS_KEY} $${MINIO_SECRET_KEY}; /usr/bin/mc admin policy set myminio/ readwrite user=$${MINIO_ACCESS_KEY}; /usr/bin/mc mb myminio/$${MINIO_MEDIA_FILES_BUCKET}; /usr/bin/mc policy set public myminio/$${MINIO_MEDIA_FILES_BUCKET}; " depends_on: - minio # 常驻MC容器 minio_mc: image: minio/mc entrypoint: /bin/sh tty: true stdin_open: true depends_on: - minio_init volumes: minio-data:
启动后,minio_init执行完初始化就退出,minio_mc会一直保持运行,你可以用docker exec -it minio_mc /bin/sh进入操作。
内容的提问来源于stack exchange,提问作者msln
相关产品推荐
相关产品推荐

