为什么捆绑程序执行程序无法在我的Docker入口点中加载rails命令?

问题描述

我通过docker-compose创建了一个Docker映像和容器,该容器由Postgresql支持的Rails应用组成。 Rails旨在通过一个docker-entrypoint.sh文件开始,如下所示:

#!/bin/sh

# Exit early if there are any errors.
set -e

# Check that there won't be any server conflicts.
if [ -f tmp/pids/server.pid ]; then
  rm tmp/pids/server.pid
fi

# -b binds the server to all IP addresses,rather than to localhost.
bundle exec rails s -b 0.0.0.0

但是,容器在启动后立即停止,并出现以下错误

bundler: Failed to load command: rails (/usr/local/bundle/bin/rails)
LoadError: cannot load such file -- /usr/local/bundle/specifications/exe/rails
  /usr/local/bundle/bin/rails:23:in `load'
  /usr/local/bundle/bin/rails:23:in `<top (required)>'

据我所知,您无法直接浏览已停止容器的文件系统,因此我将整个文件系统导出到.tar文件中:

docker export a2410e604db9 > container.tar

container.tar的内部,我发现有一个/usr/local/bundle/bin/rails可执行文件,所以我不知道为什么bundle无法加载该命令。

错误中提到的另一个目录/usr/local/bundle/specifications/exe/rails不存在。只有/usr/local/bundle/specifications,其中包含用于Rails项目的.gemspec一堆文件

是什么原因导致此bundler / LoadError问题?

解决方法

您的 rails 应用程序使用的是什么 docker 映像?如果它是公共 library/ruby 一个,那么我认为所有必需的 env 变量都将正确设置以使您的脚本正常工作。

如果不是公开的红宝石,我建议分享您的 Dockerfile

首先查看您的 PATH(和脚本)是否正在使用预期的 bundle 和 rails:

docker run -it <YOUR_DOCKER_IMAGE> bash
which bundle
which rails

如果没有,请在编写脚本以诊断问题之前先尝试手动运行它:

docker run -it <YOUR_DOCKER_IMAGE> bash
cd /path/to/app
bundle exec rails s -b 0.0.0.0

最后,确保您的 docker-compose.yml 文件公开您期望的端口。如果是 4000

ports:
      - "4000:4000"