Docker Compose中MariaDB执行自定义command后退出码0不启动服务问题
问题根因
你自定义的command配置确实覆盖了MariaDB官方镜像默认的启动逻辑。官方MariaDB镜像默认的启动流程是先执行/docker-entrypoint-initdb.d目录下的所有初始化脚本,再启动MariaDB主进程持续运行。你当前写的command仅执行了安装wget、下载解压sakila库、移动SQL文件的逻辑,执行完成后没有调用镜像原本的启动命令,所以容器会直接正常退出(退出码0)。
解决方案
方案一:本地挂载初始化SQL(最推荐)
完全不需要自定义command或镜像,直接将sakila库的SQL文件下载到本地,通过volumes挂载到容器初始化目录即可,步骤如下:
- 本地下载sakila-db.tar.gz并解压,得到
sakila-schema.sql和sakila-data.sql两个文件,放在项目的init-sql目录下 - 修改docker-compose.yml的db服务配置如下:
version: '3.1' services: db: image: mariadb:10.3 volumes: - ./init-sql:/docker-entrypoint-initdb.d environment: MYSQL_ROOT_PASSWORD: notSecureChangeMe phpmyadmin: image: phpmyadmin restart: always ports: - 8080:80
这种方案启动速度快,没有冗余操作,符合Docker最佳实践。
方案二:修改command追加默认启动逻辑
如果必须保留在容器启动时下载SQL的逻辑,只需要在你现有command的最后追加官方镜像的启动命令即可:
command: | sh -c " echo 'Starting Commands'&& apt-get update && apt-get install -y wget && wget https://downloads.mysql.com/docs/sakila-db.tar.gz && tar xzf sakila-db.tar.gz && echo 'Extraction Finished' && mv sakila-db/sakila-schema.sql /docker-entrypoint-initdb.d/1.sql && mv sakila-db/sakila-data.sql /docker-entrypoint-initdb.d/2.sql && echo ' Finished Commands' && docker-entrypoint.sh mysqld"
追加的docker-entrypoint.sh mysqld就是官方镜像默认的启动命令,会自动执行初始化目录的SQL再启动MariaDB服务。
方案三:构建自定义镜像(适合频繁启动的场景)
如果不想每次启动容器都执行apt安装、下载文件的操作,可以把这部分逻辑打包成自定义镜像:
- 新建Dockerfile文件,内容如下:
FROM mariadb:10.3 RUN apt-get update && apt-get install -y wget \ && wget https://downloads.mysql.com/docs/sakila-db.tar.gz \ && tar xzf sakila-db.tar.gz \ && mv sakila-db/sakila-schema.sql /docker-entrypoint-initdb.d/1.sql \ && mv sakila-db/sakila-data.sql /docker-entrypoint-initdb.d/2.sql \ && apt-get purge -y wget && apt-get autoremove -y && rm -rf /var/lib/apt/lists/* /sakila-db.tar.gz /sakila-db
- 修改docker-compose.yml的db服务配置:
db: build: . environment: MYSQL_ROOT_PASSWORD: notSecureChangeMe
启动时执行docker-compose up --build即可,后续启动不需要再重复执行安装下载逻辑。
内容的提问来源于stack exchange,提问作者Martin Larizzate
相关产品推荐
相关产品推荐

