0

Deploy-Rails Ich versuche, ein kleines Rails-Projekt mit dem Device-Juwel in eine Docker-Version zu migrieren. Zur Veranschaulichung (MWE) werde ich das Geräte-Beispiel verwenden.Deppen-Rails Beispiel im Produktionsmodus mit Docker

Ohne Docker alles ist in Ordnung:

git clone git://github.com/RailsApps/rails-devise.git 
cd rails-devise 
bundle install 
bundle exec rake db:migrate 
rails s 

Jetzt habe ich dieses Beispiel in der Produktion in einem Docker Container ausgeführt werden soll. Daher fügte ich Dockerfile, docker-compose.yml und .env.web hinzu. Die Idee ist, Best-Practice zu folgen und alle Geheimnisse in der Umgebung .env.web Datei setzen, die alle geheimen Schlüssel und configs enthält:

PORT=3000 
SECRET_KEY_BASE=e69d022dcead6a7025f6f7d37cf540d5c53fd5a075826998418b2165a3138ff4e32b82a45feb338a61a2d1d81f677173025b514ebc315e1fc9cd7ad4ed80d145 
DOMAIN_NAME=example.com 

Der Geheimschlüssel wird über erhalten:

bundle exec rake secret 

zu helfen Beantworte ich diese Frage, lege ich alles in eine Abzweigung dieses Repositories. Zu meinem Problem reproduzieren können Sie diese Befehle

git clone https://github.com/patwie-stuff/rails-devise.git 
cd rails-devise 
docker-compose build 

Arbeiten laufen, aber ich habe:

** Invoke assets:precompile (first_time) 
** Invoke assets:environment (first_time) 
** Execute assets:environment 
** Invoke environment (first_time) 
** Execute environment 
rake aborted! 
Devise.secret_key was not set. Please add the following to your Devise initializer: 

    config.secret_key = '28952e4c2a1372b9ff2ec6b46fbbe942fa192fac9192982313f692e7ff3fae6c9227a8b6fd0034b87e64ebefb757c854095cc4f3594f7254280697ddf98c47b8' 

Please ensure you restarted your application after installing Devise or setting the key. 
/usr/local/bundle/gems/devise-3.5.2/lib/devise/rails/routes.rb:475:in `raise_no_secret_key' 
/usr/local/bundle/gems/devise-3.5.2/lib/devise/rails/routes.rb:209:in `devise_for' 
/myapp/config/routes.rb:3:in `block in <top (required)>' 

Dieser Fehler resultiert aus

RUN RAILS_ENV=production bundle exec rake assets:precompile --trace 

Das Standardverhalten sagt devise secret_key_base von Schienen verwendet, die durch Standard. Dieser Wert wird aus der Umgebung abgerufen, daher die Datei .env.web. Aber es ist da! Wie kann ich das Zeug von secret.yml in der Umgebungsdatei behalten?

uncommenting Linie 15,16 im Dockerfile und läuft

docker-compose run web ruby test.rb 

gibt das korrekte Ergebnis a_production_secret_key.

Gibt es einen Unterschied zwischen "Docker-Compose Build" und "Docker-Compose Run Web test.rb"? Offensichtlich ist der Unterschied Build-Zeit und Laufzeit.

Aber wie gehe ich mit der SECRET_KEY_BASE-Variable für die Produktion um? Ich möchte das nicht in der Dockerdatei fest codieren. Was ist die beste Vorgehensweise hier? Für die Produktion muss man die Assets vorkompilieren.

Kann ich dort einen Dummy-Wert für SECRET_KEY_BASE eingeben? Ich fühle mich nicht gut mit einem hartcodierten Dummy-Wert in der Dockerfile.

+0

Ich habe das gleiche Problem ... obwohl ich eine lokale env-Datei einlege, nicht env.web. Haben Sie eine Antwort darauf gefunden? Die einzige Problemumgehung, die ich finde, ist die Einstellung der config.assets.compile = true in der Produktion, und das ist definitiv nicht Best Practice ... Das Seltsamste ist, dass ich Rake Assets ausführen kann: Precompile innerhalb der Produktionsumgebung , aber nicht auf dockerfile ich nicht ... – MrWater

Antwort

0

Nach einigen Stunden und vielen Referenzen habe ich endlich eine gefunden, die funktioniert.

Was für mich als der trockenste Code funktionierte, ist die Lösung von http://equinox.one/blog/2016/04/20/Docker-with-Ruby-on-Rails-in-development-and-production/. Ersetzen Sie einfach in Ihrem Dockerfile

RUN RAILS_ENV = Produktionsbündel exec Rake Vermögen: precompile --trace

mit

# Set Rails to run in production 
ENV RAILS_ENV production 
ENV RACK_ENV production 

RUN bundle exec rake SECRET_KEY_BASE=dummytoken assets:precompile 

von hier: https://nickjanetakis.com/blog/dockerize-a-rails-5-postgres-redis-sidekiq-action-cable-app-with-docker-compose Ich verstehe, dass die Werte vor Vermögenswerte : Vorkompilierung kann Dummy sein, solange sie gültige Syntax haben.

EDIT:

Obwohl die Lösung über mir erlaubt, das Vermögen vorkompilierte zu haben, noch wurden die Vermögenswerte, die nicht in der Produktion geladen werden.

Am Ende endete ich mit rails 12 factor gem, wie ich in dieser Antwort sah: https://stackoverflow.com/a/36441251/1461972, und es hat alles geklappt.

Verwandte Themen