首页 > 解决方案 > 构建映像失败时在 Dockerfile 中运行“bin/rails assets:precompile”

问题描述

我正在尝试建立我的生产形象,但我遇到了问题。

我运行这个命令 docker build -f docker/production/app/Dockerfile .

Dockerfile 是

FROM ruby:2.7.1-alpine3.12

# Install dependencies:
# - build-base: To ensure certain gems can be compiled
# - mysql-dev: Communicate with mysql through the mysql2 gem
# - libxslt-dev libxml2-dev: Nokogiri native dependencies
RUN apk --update --no-cache add build-base tzdata mysql-dev libxslt-dev libxml2-dev nodejs

RUN apk add --no-cache yarn --repository="http://dl-cdn.alpinelinux.org/alpine/edge/community"

ENV RAILS_ROOT /var/www/app
RUN mkdir -p $RAILS_ROOT

COPY Gemfile* /var/www/app/
WORKDIR /var/www/app

RUN bundle config set without 'development test'

RUN bundle install --jobs 20 --retry 5

COPY package.json package.json
COPY yarn.lock yarn.lock

RUN yarn install --check-files

COPY . /var/www/app/

EXPOSE 3000

# Clean up APK when done.
RUN rm -f /var/cache/apk/*

RUN bin/rails assets:precompile

ENTRYPOINT ["./docker-entrypoint.sh"]
CMD ["bundle", "exec", "puma", "-C", "config/puma/production.rb"]

码头工人组成是

version: '3.5'

services:
  app:
    image: XYZ
    env_file:
      - docker/production/.env/redis
      - docker/production/.env/database
      - docker/production/.env/app

运行命令“bin/rails assets:precompile”时,我遇到了这个问题

Step 17/19 : RUN bin/rails assets:precompile
 ---> Running in 57c98721e8c6
rails aborted!
KeyError: key not found: "REDIS_SERVER"
/var/www/app/config/initializers/sidekiq.rb:19:in `fetch'
/var/www/app/config/initializers/sidekiq.rb:19:in `block in <main>'
/usr/local/bundle/gems/sidekiq-6.0.7/lib/sidekiq.rb:85:in `configure_client'
/var/www/app/config/initializers/sidekiq.rb:18:in `<main>'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:318:in `block in load'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:291:in `load_dependency'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:318:in `load'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/engine.rb:666:in `block in load_config_initializer'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/notifications.rb:182:in `instrument'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/engine.rb:665:in `load_config_initializer'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/engine.rb:625:in `block (2 levels) in <class:Engine>'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/engine.rb:624:in `each'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/engine.rb:624:in `block in <class:Engine>'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/initializable.rb:32:in `instance_exec'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/initializable.rb:32:in `run'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/initializable.rb:61:in `block in run_initializers'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/initializable.rb:50:in `each'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/initializable.rb:50:in `tsort_each_child'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/initializable.rb:60:in `run_initializers'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/application.rb:363:in `initialize!'
/var/www/app/config/environment.rb:5:in `<main>'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/usr/local/bundle/gems/zeitwerk-2.3.1/lib/zeitwerk/kernel.rb:34:in `require'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in `block in require'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:291:in `load_dependency'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in `require'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/application.rb:339:in `require_environment!'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/application.rb:523:in `block in run_tasks_blocks'
/usr/local/bundle/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:62:in `block (2 levels) in define'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/command.rb:48:in `invoke'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands.rb:18:in `<main>'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in `block in require'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:291:in `load_dependency'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => environment
(See full trace by running task with --trace)
The command '/bin/sh -c bin/rails assets:precompile' returned a non-zero code: 1

Docker 无法访问环境变量。在我的 config/initializers/sidekiq.rb 中,我有

Sidekiq.configure_server do |config|
  config.redis = { url: ENV.fetch('REDIS_SERVER') }
end

我在像这样的文件中配置我的环境变量

docker/production/.env/redis
docker/production/.env/database
docker/production/.env/app

有没有办法让 docker 访问这些文件?

问候。

标签: ruby-on-railsdockerdocker-composeasset-pipelineruby-on-rails-6

解决方案


推荐阅读