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

Docker中Sinatra应用执行mysql命令失败求助

问题分析与解决方案

核心问题定位

执行docker compose run api bundle exec rake db:schema:load时报错找不到mysql命令,本质是API服务容器内缺少Rake任务可调用的MySQL客户端工具,同时存在环境变量命名不匹配的辅助问题。

具体修复步骤

1. 修正Dockerfile,安装正确的MySQL客户端

你的Dockerfile中安装了mariadb-server mariadb-client,但API容器不需要MariaDB服务,且部分场景下mariadb-client的命令识别存在问题。建议替换为Debian官方适配的MySQL客户端包:

FROM ruby:2.7.6

# 仅安装必要的MySQL客户端及依赖,移除无用的mariadb-server
RUN apt-get update -qq && apt-get install -y build-essential default-mysql-client gnupg

RUN gem install bundler

ENV GEM_HOME="/usr/local/bundle"
ENV PATH $GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH

ENV APP_HOME /app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

COPY Gemfile* ./

COPY ["config.ru", "Gemfile", "Gemfile.lock", "Rakefile", "./"]
COPY /app /app
COPY config/ config/
COPY db/ db/
COPY lib/ lib/
COPY rakelib/ rakelib/
COPY bin/ bin/

EXPOSE 3000

修改后重新构建API镜像:

docker compose build api

2. 统一环境变量命名

database.yml中使用DB_PASS作为密码变量,但docker-compose.yml的API服务配置的是DB_PASSWORD,导致密码读取逻辑不匹配。二选一修改即可:

  • 方案一:修改docker-compose.yml的API环境变量:
environment:
  - DB_HOST=db
  - DB_USER=cx_core
  - DB_NAME=cx_core
  - DB_PASS=cx_core  # 将DB_PASSWORD改为DB_PASS
  • 方案二:修改database.yml中的变量名:
password: <%= ENV['DB_PASSWORD'] || 'cx_core' %>

3. 验证MySQL客户端可用性

执行以下命令确认API容器内是否能找到mysql命令:

docker compose run api which mysql

若返回/usr/bin/mysql类路径,说明客户端安装成功;若返回空,需检查Dockerfile的安装命令是否执行完整。

4. 可选:添加数据库就绪等待逻辑

depends_on仅保证容器启动顺序,不确保MySQL服务完全就绪。可在API服务的启动命令中加入等待逻辑,避免因数据库未初始化导致的连接失败:

command: >
  sh -c "until mysql -h db -u cx_core -pcx_core -e 'SELECT 1'; do sleep 2; done && bundle exec puma -p 3000"

验证修复

重新执行Rake任务:

docker compose run api bundle exec rake db:schema:load

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:50:46