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
相关产品推荐
相关产品推荐

