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

Cloud Run部署Sinatra应用时--source参数异常求助

Sinatra应用部署Cloud Run遇到--source参数注入问题

我是Cloud Run新手,正在部署Sinatra应用。查了文档还是搞不懂为啥--source参数会自动被传入——这不是我应用里设的,应该是部署命令加的。我已经调过好几次Dockerfile和应用配置,不想本地装Docker,但容器化部署可能能解决问题,求其他可行建议。

错误日志

1) terminated: Application failed to start: kernel init: cannot resolve init executable: error finding executable "--source" in PATH [/usr/local/bundle/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin]: no such file or directory

2) /usr/local/bundle/gems/sinatra-3.0.6/lib/sinatra/main.rb:22:in `<module:Sinatra>': invalid option: --source (OptionParser::InvalidOption)

部署命令输出

$ gcloud run deploy
Deploying from source. To deploy a container use [--image]. See https://cloud.google.com/run/docs/deploying-source-code for more details.
Source code location (/home/bjorn/...):      
Next time, use `gcloud run deploy --source .` to deploy the current directory.

Dockerfile内容

# Dockerfile

FROM ruby:3.2.2

WORKDIR /usr/src/app

COPY Gemfile Gemfile.lock ./
ENV BUNDLE_FROZEN=true
ENV BUNDLER_VERSION 2.4.10

RUN gem install bundler && \
  bundle config set --local without 'test' && \
  bundle install

COPY server.rb config.ru puma.rb ./

EXPOSE 8080

Entrypoint ["ruby", "./server.rb"]
# Alternately:
# CMD ["ruby", "./server.rb"]
# CMD ["bundle", "exec", "rackup", "--host", "0.0.0.0", "-p", "8080"]
# CMD ["web: bundle exec ruby server.rb -p 8080

补充详细日志

DEFAULT 2023-08-21T07:45:18.516796Z /usr/local/bundle/gems/sinatra-3.1.0/lib/sinatra/main.rb:22:in `<module:Sinatra>': invalid option: --source (OptionParser::InvalidOption)
DEFAULT 2023-08-21T07:45:18.516820Z from /usr/local/bundle/gems/sinatra-3.1.0/lib/sinatra/main.rb:3:in `<top (required)>'
DEFAULT 2023-08-21T07:45:18.516826Z from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
DEFAULT 2023-08-21T07:45:18.516831Z from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
DEFAULT 2023-08-21T07:45:18.516836Z from /usr/local/bundle/gems/sinatra-3.1.0/lib/sinatra.rb:3:in `<top (required)>'
DEFAULT 2023-08-21T07:45:18.516840Z from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:159:in `require'
DEFAULT 2023-08-21T07:45:18.516845Z from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:159:in `rescue in require'
DEFAULT 2023-08-21T07:45:18.516849Z from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:39:in `require'
DEFAULT 2023-08-21T07:45:18.516854Z from ./server.rb:1:in `<main>'
DEFAULT 2023-08-21T07:45:18.516859Z <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sinatra (LoadError)
DEFAULT 2023-08-21T07:45:18.516864Z from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
DEFAULT 2023-08-21T07:45:18.516867Z from ./server.rb:1:in `<main>'
WARNING 2023-08-21T07:45:18.579930873Z Container called exit(1).
ERROR 2023-08-21T07:45:18.619506Z [protoPayload.serviceName: run.googleapis.com] [protoPayload.methodName: v1] [protoPayload.resourceName: [xyz] Ready condition status changed to False for Revision xyz with message: The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information. Logs URL: https://console.cloud.google.com/logs/viewer?project=etc For more troubleshooting guidance, see https://cloud.google.com/run/docs/troubleshooting#container-failed-to-start

问题根源与解决建议

1. --source参数注入的原因

你用的是Cloud Run的源码部署模式,这个模式下Cloud Run会自动构建容器,但会把--source参数传递给你的应用入口,而Sinatra的CLI解析器不认识这个参数,导致报错。另外你的Dockerfile还有两个小问题:

  • Entrypoint拼写错误,应该用大写ENTRYPOINT,小写会被当作普通指令,Cloud Run会默认把部署参数传给应用。
  • 最后一行注释的CMD语法错误,引号未闭合。

2. 无需本地Docker的解决方案

方案一:修正Dockerfile继续用源码部署

把Dockerfile里的Entrypoint改成大写ENTRYPOINT,确保参数不会被错误传递:

# 替换原来的Entrypoint行
ENTRYPOINT ["ruby", "./server.rb"]

同时修复最后一行注释的语法错误:

# CMD ["web", "bundle exec ruby server.rb -p 8080"]  # 修正引号和格式

之后重新运行部署命令:

gcloud run deploy --source .

方案二:用Cloud Build远程构建镜像再部署

如果不想本地装Docker,可以用Cloud Build在云端构建镜像,再部署到Cloud Run:

  1. 确保项目已启用Cloud Build API
  2. 运行以下命令完成云端构建与部署:
gcloud builds submit --tag gcr.io/[你的项目ID]/sinatra-app .
gcloud run deploy sinatra-app --image gcr.io/[你的项目ID]/sinatra-app

这种方式下Cloud Run直接使用构建好的镜像,不会传递--source参数给应用。

方案三:修改Sinatra应用忽略未知参数

在server.rb开头添加代码,让Sinatra忽略--source这类未知参数:

require 'sinatra'

# 过滤掉--source参数
ARGV.delete_if { |arg| arg.start_with?('--source') }

# 你的应用代码示例
get '/' do
  "Hello World!"
end

这个方法能快速绕开参数问题,但不如修正Dockerfile规范。

3. 额外注意事项

  • 确保server.rb监听0.0.0.0和环境变量PORT指定的端口,这是Cloud Run的强制要求:
set :bind, '0.0.0.0'
set :port, ENV['PORT'] || 8080
  • 检查Gemfile是否包含sinatra和puma(如果用puma做服务器),保证bundle install能正确安装依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:55:57