如何在Ubuntu 18.04基础的Docker镜像中安装MySQL 8及带管理插件的RabbitMQ
你当前配置存在的核心问题
- 版本与源不匹配:Dockerfile中定义的
MYSQL_VERSION=5.7和你需要安装MySQL 8.0的需求不符,且Ubuntu 18.04默认软件源没有MySQL 8.0安装包,直接指定8.0版本安装会直接报包不存在错误 - RabbitMQ安装位置错误:你将RabbitMQ的安装逻辑写在了运行时才执行的
rabbit_entrypoint.sh中,镜像构建阶段并不会安装该服务,属于运行时临时安装,不仅冗余还容易因网络问题失败 - MySQL初始化逻辑不兼容8.0版本:现有的
mysql-entrypoint.sh是适配MySQL 5.7的写法,MySQL 8.0不支持GRANT ... IDENTIFIED BY同时创建用户和授权的语法,必须拆分为先创建用户再授权 - 进程管理配置缺失:未确认supervisor配置中同时包含MySQL和RabbitMQ两个进程的托管规则,容易出现只启动单个服务的问题
修复步骤
1. 修改Dockerfile配置
调整MySQL版本参数,添加MySQL 8.0官方源,将RabbitMQ安装移到构建阶段:
FROM ubuntu:18.04 RUN adduser --system --group --no-create-home mysql RUN adduser --group --home /home/rabbitmq rabbitmq # 修改MYSQL_VERSION为8.0 ENV MYSQL_USER=mysql \ MYSQL_VERSION=8.0 \ MYSQL_DATA_DIR=/var/lib/mysql \ MYSQL_RUN_DIR=/run/mysqld \ MYSQL_LOG_DIR=/var/log/mysql RUN : \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ software-properties-common \ && add-apt-repository -y ppa:deadsnakes \ # 新增:导入MySQL官方GPG密钥、添加MySQL8.0源 && curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 | gpg --dearmor > /usr/share/keyrings/mysql-archive-keyring.gpg \ && echo "deb [signed-by=/usr/share/keyrings/mysql-archive-keyring.gpg] http://repo.mysql.com/apt/ubuntu/ bionic mysql-8.0" > /etc/apt/sources.list.d/mysql.list \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ python3.8-venv \ supervisor \ gcc ffmpeg libsm6 libxext6 netcat pkg-config curl apt-transport-https gosu gnupg debconf-utils \ mysql-server=${MYSQL_VERSION}* \ # 新增:构建阶段安装RabbitMQ,无需放到运行时入口 && curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | apt-key add - \ && echo "deb https://dl.bintray.com/rabbitmq-erlang/debian bionic erlang" > /etc/apt/sources.list.d/bintray.rabbitmq.list \ && echo "deb https://dl.bintray.com/rabbitmq/debian bionic main" >> /etc/apt/sources.list.d/bintray.rabbitmq.list \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends rabbitmq-server \ && rabbitmq-plugins enable --offline rabbitmq_management \ # 原有清理逻辑保留 && rm -rf ${MYSQL_DATA_DIR} \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && gosu nobody true # 后续原有Python环境配置、文件拷贝逻辑保留,可删除rabbit_entrypoint.sh相关的拷贝和授权步骤
2. 修改mysql-entrypoint.sh适配MySQL 8.0语法
将所有GRANT ... IDENTIFIED BY的写法拆分为创建用户+授权两步:
# 原写法示例(替换前) mysql -uroot -e "GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '' WITH GRANT OPTION;" # 新写法示例(替换后) mysql -uroot -e "CREATE USER IF NOT EXISTS 'debian-sys-maint'@'localhost' IDENTIFIED BY '';" mysql -uroot -e "GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' WITH GRANT OPTION;"
所有创建普通DB用户、远程管理员用户的位置都要做相同修改。
3. 确认supervisor配置包含双进程托管
确保你的supervisor.conf中同时配置了两个服务的启动规则:
[program:mysql] command=/mysql-entrypoint.sh user=root autostart=true autorestart=true stdout_logfile=/var/log/supervisor/mysql.log stderr_logfile=/var/log/supervisor/mysql.err.log [program:rabbitmq] command=/usr/sbin/rabbitmq-server user=rabbitmq autostart=true autorestart=true stdout_logfile=/var/log/supervisor/rabbitmq.log stderr_logfile=/var/log/supervisor/rabbitmq.err.log
内容的提问来源于stack exchange,提问作者abhinavchat
相关产品推荐
相关产品推荐

