问题描述
我通过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"