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:
- 确保项目已启用Cloud Build API
- 运行以下命令完成云端构建与部署:
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
相关产品推荐
相关产品推荐

