ruby-on-rails - 1 个系统上的 2 个 Docker 项目和 docker-compose 选择了错误的 ruby 版本(除非我重建)
问题描述
我有 2 个针对不同客户的项目:
A. Ruby 2.7.2 和 Rails 6
B. Ruby 2.5.8 和 Rails 5.2
每个人都有自己的docker-compose
文件和相关的设置脚本,跟随很棒的 EvilMartians 博客文章在这里。
我可以很好地构建两个项目并且一切都运行。
但是,每次切换项目时,我都必须重新构建,这似乎违背了拥有自包含 docker 容器的目的。
这是因为docker-compose run rails
抛出错误:
如果我先运行项目 A,然后切换到 B:
Your Ruby version is 2.7.2, but your Gemfile specified 2.5.8
如果我先运行项目 B,然后切换到 A:
Your Ruby version is 2.5.8, but your Gemfile specified 2.7.2
如果我尝试通过再次运行设置来解决它,我会得到同样的错误。(即。docker-compose run runner ./bin/setup
)
因此,我必须运行 docker-compose build
以使用选择正确 ruby 版本的 ARG 来强制重建图像。但这肯定不是必需的。
所以项目 A 正在记住项目 B 的 ruby 版本,反之亦然。
似乎他们使用的是相同的底层图像,导致运行构建命令。
让他们不这样做(共享图像)是否有意义(甚至有办法?) - 即我可以以某种方式标记图像,以便它们“绑定”到每个项目,可能基于 ruby 版本?
或者只是重建是标准做法?
文件
docker-compose
每个项目都有自己的(几乎相同)docker-compose
文件,您可以在下面看到(为简洁起见,仅显示顶部)。
显然,A 和 B 之间的不同之处在于指定的依赖项的版本:
version: '2.4'
x-app: &app
build:
context: .dockerdev
dockerfile: Dockerfile
args:
RUBY_VERSION: '2.5.8'
PG_MAJOR: '13'
NODE_MAJOR: '12'
YARN_VERSION: '1.13.0'
BUNDLER_VERSION: '1.17.2'
environment: &env
NODE_ENV: development
RAILS_ENV: ${RAILS_ENV:-development}
image: example-dev:1.1.0
tmpfs:
- /tmp
x-backend: &backend
<<: *app
stdin_open: true
tty: true
volumes:
- .:/app:cached
- rails_cache:/app/tmp/cache
- bundle:/usr/local/bundle
- node_modules:/app/node_modules
- packs:/app/public/packs
- .dockerdev/.psqlrc:/root/.psqlrc:ro
- .dockerdev/.bashrc:/root/.bashrc:ro
environment:
<<: *env
REDIS_URL: redis://redis:6379/
DATABASE_URL: postgres://postgres:postgres@postgres:5432
BOOTSNAP_CACHE_DIR: /usr/local/bundle/_bootsnap
WEBPACKER_DEV_SERVER_HOST: webpacker
WEB_CONCURRENCY: 1
HISTFILE: /app/log/.bash_history
PSQL_HISTFILE: /app/log/.psql_history
EDITOR: vi
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
...services and volumes follow...
重要的提示
这是同一个问题,但是因为 OP 提到rbenv
每个人都因为不理解 docker 而对他发脾气,认为他/她rbenv
用来管理他的主机系统上的不同版本。
但这不是OP的重点。OP 的观点是docker-compose
似乎忽略了撰写文件中指定的版本。
所以让我明确说明:
- 这两个项目抱怨的是 OTHER 项目的 ruby 版本,而不是我的主机系统上的版本
- 两个项目都没有隐藏的 .ruby-version (不需要,因为我使用 dockerfile 来指定版本)
- 我没有安装任何 ruby 版本管理器,因为我使用的是 docker,所以我不需要它们
- 我的主机系统 ruby 版本是 2.6.3,所以显然它没有抱怨
解决方案
像往常一样,发布后 1 分钟!灯泡着火了。
我意识到图像都用相同的标签标记:
image: example-dev:1.1.0
这就是发生这种情况的原因。哦!
因此,通过设置不同的标签,我可以更快地切换,而无需重建或看到 ruby 版本错误。
推荐阅读
- c# - 通过反射更新实体属性值
- firebase - Flutter:StreamBuilder 中的 AnimatedSwitcher
- flutter - 等待未来函数返回值,直到另一个未来在颤振中解决
- react-native - 将更改传播到子组件的正确方法是什么?
- java - 未正确看到微调器
- python-3.x - 重采样以特定数据结尾的数据
- php - 使用个性化内容编辑 Wordpress 侧边栏
- authentication - 页面加载时基于角色的 Blazor 授权
- amazon-web-services - 部署无服务器应用程序时策略格式错误
- node.js - 如何以角度获取登录用户的 ID(MONGODB,后端的 NODEJS)