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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:06:04