Dockerfile
# 基础镜像
FROM alpine:3.23
LABEL maintainer="[email protected]"
# 环境变量
ENV MYSQL_ROOT_PASSWORD=123456 \
MYSQL_DATA_DIR=/var/lib/mysql
# 只安装 mariadb 服务端 + 时区(清理缓存)
RUN apk update && \
apk add --no-cache mariadb tzdata && \
mkdir -p ${MYSQL_DATA_DIR} /run/mysqld && \
chown -R mysql:mysql ${MYSQL_DATA_DIR} /run/mysqld && \
rm -rf /var/cache/apk/*
# 复制启动脚本
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
# 数据持久化
VOLUME ["${MYSQL_DATA_DIR}"]
# 暴露端口
EXPOSE 3306
# 启动
ENTRYPOINT ["docker-entrypoint.sh"]
docker-entrypoint.sh
#!/bin/sh
set -e
# 首次初始化数据库
if [ ! -d "${MYSQL_DATA_DIR}/mysql" ]; then
echo ">> 首次启动:初始化 MariaDB..."
# 1. 初始化数据库文件(服务端自带工具,无需客户端)
mariadb-install-db --user=mysql --datadir=${MYSQL_DATA_DIR} --force --skip-test-db
# 2. 关键:用服务端自带参数直接初始化 root 密码(不需要 mysql 命令!)
# 这是纯服务端初始化方式,完美解决 mysql: not found
mariadbd --user=mysql --datadir=${MYSQL_DATA_DIR} --bootstrap << EOF
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF
echo ">> 数据库初始化完成,root 密码已设置!"
fi
# 前台启动服务
echo ">> 启动 MariaDB 服务..."
exec mariadbd --user=mysql --datadir=${MYSQL_DATA_DIR} --socket=/run/mysqld/mysqld.sock --port=3306 --skip-networking=OFF