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在哪里找到不正确的环境?我检查了所有已知的地方.
要完成@faron的回答:
您的 docker-compose 配置中有几个错误:
web
节缩进(整个子块应向右缩进)environment
节不是数组,而是键值对env_file
节是无用的,所有定义的变量.env
都会被节覆盖environment
。environment
都env_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)
归档时间: |
|
查看次数: |
703 次 |
最近记录: |