首页 > 解决方案 > 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似乎忽略了撰写文件中指定的版本。

所以让我明确说明:

标签: ruby-on-railsrubydockerdocker-compose

解决方案


像往常一样,发布后 1 分钟!灯泡着火了。

我意识到图像都用相同的标签标记:

image: example-dev:1.1.0

这就是发生这种情况的原因。哦!

因此,通过设置不同的标签,我可以更快地切换,而无需重建或看到 ruby​​ 版本错误。


推荐阅读