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

Docker容器构建时MySQL/MariaDB启动后自动停止的问题求助

问题描述

我编写了简单的Dockerfile,基于Ubuntu镜像安装MySQL/MariaDB并尝试启动服务,但服务启动后随即停止,导致镜像构建失败。已尝试Ubuntu 22.04、20.04、18.04版本,以及切换安装MariaDB,均出现相同问题。

原Dockerfile内容:

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive 
RUN apt-get update -y
RUN apt-get -y full-upgrade;
RUN apt-get -y install apt-utils
RUN apt-get -y install default-mysql-server
RUN service mysql start
RUN service mysql status

使用docker build . --progress=plain构建时,报错信息:

#9 [6/7] RUN service mysql start
#9 0.662  * Starting MySQL database server mysqld
#9 0.725 su: warning: cannot change directory to /nonexistent: No such file or directory
#9 2.965    ...done.
#9 DONE 3.1s

#10 [7/7] RUN service mysql status
#10 0.832  * MySQL is stopped.
#10 ERROR: process "/bin/sh -c service mysql status" did not complete successfully: exit code: 3
------
 > [7/7] RUN service mysql status:
#10 0.832  * MySQL is stopped.
------
Dockerfile:8
--------------------
   6 |     RUN apt-get -y install default-mysql-server
   7 |     RUN service mysql start
   8 | >>> RUN service mysql status
--------------------
ERROR: failed to solve: process "/bin/sh -c service mysql status" did not complete successfully: exit code: 3

也尝试过替换基础镜像为ubuntu:20.04/ubuntu:18.04,以及修改安装命令为:

RUN apt-get -y install mariadb-server
RUN service mariadb start
RUN service mariadb status

所有尝试均失败,请问原因是什么?哪里操作错误?

问题原因分析
  • Docker构建阶段的RUN指令是独立隔离的:每个RUN都会创建一个临时容器,执行完命令后该容器就被冻结为镜像层,所有进程随之退出。RUN service mysql start只是在当前临时容器内启动了服务,但命令执行完成后,这个临时容器的生命周期就结束了,服务自然停止。下一个RUN service mysql status是在全新的临时容器里执行,根本看不到之前启动的服务。
  • 构建阶段不适合启动长期运行的服务:Docker镜像构建的核心是打包环境和程序,而非运行服务。服务应该在容器启动阶段,通过CMD或ENTRYPOINT指令来启动。
  • /nonexistent警告的由来:MySQL默认用mysql用户运行,但该用户的家目录在安装后可能未创建,不过这只是警告,不是导致服务停止的核心原因。
正确的解决方案

修改Dockerfile,不在构建阶段启动服务,而是在容器启动时通过CMD指令启动MySQL:

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive

# 合并RUN指令减少镜像层数,同时清理缓存缩小镜像体积
RUN apt-get update -y && \
    apt-get -y full-upgrade && \
    apt-get -y install apt-utils default-mysql-server && \
    # 创建mysql用户的家目录,解决启动警告
    mkdir -p /var/lib/mysql && \
    chown mysql:mysql /var/lib/mysql && \
    # 清理APT缓存
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# (可选)复制自定义MySQL配置文件
# COPY my.cnf /etc/mysql/my.cnf

# (可选)添加初始化脚本,用于设置密码、创建数据库等
# COPY init.sql /docker-entrypoint-initdb.d/

# 容器启动时启动MySQL服务
CMD ["mysqld_safe"]

使用步骤

  1. 构建镜像:docker build -t ubuntu-mysql .
  2. 运行容器:docker run -d --name mysql-demo -p 3306:3306 ubuntu-mysql
  3. 进入容器操作MySQL:docker exec -it mysql-demo mysql -u root -p

内容的提问来源于stack exchange,提问作者hanshenrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:57:43