使用Docker Compose时设置Rails/Rack环境

And*_*ndy 8 ruby-on-rails docker

我有一个docker-compose环境如下:

web:
build: .
environment:
  - RAILS_ENV=development
  - RACK_ENV=development
  - DOCKERIZED=true
env_file: 
  - .env
ports:
  - "3000:3000"
volumes:
  - .:/usr/app    
links:
  - redis
  - db
  - search
  - memcache
networks:
  - front-tier
  - back-tier
command: bundle exec rails s -p 3000 -b '0.0.0.0'
Run Code Online (Sandbox Code Playgroud)

在我的.env文件中,我有以下内容:

RAILS_ENV=development
RACK_ENV=development
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试使用数据库种子时

docker-compose run web bundle exec rake db:setup RAILS_ENV=development
Run Code Online (Sandbox Code Playgroud)

播种数据库时,日志中"Rails.env"的输出为"production".我跑的时候

docker-compose run web env
Run Code Online (Sandbox Code Playgroud)

它获得以下环境变量:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=b6fcc864cf45
TERM=xterm
DOCKERIZED=true
RACK_ENV=development
RAILS_ENV=development
Run Code Online (Sandbox Code Playgroud)

但是,当我运行以下命令时:

docker-compose run web rails r "print Rails.env"
Run Code Online (Sandbox Code Playgroud)

我明白了:

> production
Run Code Online (Sandbox Code Playgroud)

所以有些东西导致我的Web容器认为它在生产环境中.我已将RAILS_ENV设置为Web容器的Dockerfile中的环境变量,并且还使用以下命令启动服务器:

CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-e", "development"]
Run Code Online (Sandbox Code Playgroud)

这也导致了问题,因为我无法连接到我的redis实例,因为Rails正在拾取生产设置并映射到'localhost'而不是'redis'容器.

我们使用的是Ruby 2.3.1(在RVM下)和Rails 4.2.6.我们正在使用Docker Compose 1.8.0.

这个设置在一个月前完美地工作,所以我们怀疑在线路的某个地方有一个小小的变化悄悄进入堆栈,目的是让我的生活变得悲惨.

总结一下我的问题:Rails在哪里找到不正确的环境?我检查了所有已知的地方.

Ghi*_*his 0

要完成@faron的回答:

您的 docker-compose 配置中有几个错误:

  1. web节缩进(整个子块应向右缩进)
  2. environment节不是数组,而是键值对
  3. env_file节是无用的,所有定义的变量.env都会被节覆盖environment
  4. 和部分environmentenv_file在运行时加载,但大多数时候,RAILS_ENV容器构建阶段也需要加载。

这通常是我对 Rails 容器所做的事情(利用 DOCKER_BUILDKIT,我认为它现在在 docker-compose 中默认使用):

Dockerfile

FROM ruby:3.1.0 AS development
WORKDIR /app
ENV RAILS_ENV=development
COPY Gemfile Gemfile.lock ./
RUN bundle install --quiet
COPY . .
CMD ["bundle", "exec", "rails", "s", "-b", "0.0.0.0", "--environment=development"]

FROM ruby:3.1.0 AS production
WORKDIR /app
ENV RAILS_ENV=production
COPY Gemfile Gemfile.lock ./
RUN bundle install --quiet --jobs 20 --retry 5 --without development test
COPY . .
CMD ["bundle", "exec", "rails", "s", "-b", "0.0.0.0", "--environment=production"]
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

FROM ruby:3.1.0 AS development
WORKDIR /app
ENV RAILS_ENV=development
COPY Gemfile Gemfile.lock ./
RUN bundle install --quiet
COPY . .
CMD ["bundle", "exec", "rails", "s", "-b", "0.0.0.0", "--environment=development"]

FROM ruby:3.1.0 AS production
WORKDIR /app
ENV RAILS_ENV=production
COPY Gemfile Gemfile.lock ./
RUN bundle install --quiet --jobs 20 --retry 5 --without development test
COPY . .
CMD ["bundle", "exec", "rails", "s", "-b", "0.0.0.0", "--environment=production"]
Run Code Online (Sandbox Code Playgroud)
DOCKER_BUILDKIT=1 docker compose up
Run Code Online (Sandbox Code Playgroud)