Hallo. Auch dieses Mal habe ich das Verfahren zum Erstellen einer Rails-Anwendungsentwicklungsumgebung mit Docker zusammengefasst. Das letzte Mal habe ich zwei Container gestartet, einen für Rails und einen für die Datenbank, aber dieses Mal habe ich auch den Nginx-Container als Webserver gestartet.
Ruby: 2.5.8 Rails: 5.2.4.4 MySQL: 5.7.31 Nginx: 1.19.2 Docker: 19.03.12 Docker Compose: 1.26.2
Die Gesamtkonfiguration ist wie folgt. Jetzt erstellen wir Verzeichnisse und Dateien wie in diesem Konfigurationsdiagramm gezeigt.
Gesamtzusammensetzung
/test-app
├── Dockerfile
├── Dockerfile.nginx
├── docker-compose.yml
├── nginx.conf
├── Gemfile
└── Gemfile.lock
Erstellen Sie zunächst das Stammverzeichnis Ihres Projekts.
terminal
$ mkdir test-app
Und direkt unter dem Stammverzeichnis
Dockerfile
Dockerfile.nginx
docker-compose.yml
nginx.conf
Gemfile
Gemfile.lock
Erstellen Sie diese.
terminal
$ cd test-app
$ touch Dockerfile Dockerfile.nginx docker-compose.yml nginx.conf Gemfile Gemfile.lock
Der Inhalt jeder oben erstellten Datei ist wie folgt. (Lassen Sie Gemfile.lock leer.)
Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
build-essential \
node.js
WORKDIR /test-app
COPY . /test-app
RUN bundle install
Dockerfile.nginx
FROM nginx
RUN rm -f /etc/nginx/conf.d/*
COPY nginx.conf /etc/nginx/conf.d/test-app.conf
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
containers/nginx/nginx.conf
#Angeben des Proxy-Ziels
#Senden Sie die von Nginx erhaltene Anfrage an das Backend-Puma
upstream test-app {
#Ich möchte mit Steckdosen kommunizieren, also Puma.Geben Sie die Socke an
server unix:///test-app/tmp/sockets/puma.sock;
}
server {
listen 80;
#Geben Sie die Domäne oder IP an
server_name _;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
#Angeben des Dokumentstamms
root /test-app/public;
client_max_body_size 100m;
error_page 404 /404.html;
error_page 505 502 503 504 /500.html;
try_files $uri/index.html $uri @test-app;
keepalive_timeout 5;
#Proxy-bezogene Einstellungen umkehren
location @test-app {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://test-app;
}
location /favicon {
empty_gif;
access_log off;
log_not_found off;
}
}
Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5.2'
docker-compose.yml
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
command: bundle exec puma -C config/puma.rb
volumes:
- .:/test-app
tty: true
stdin_open: true
depends_on:
- db
db:
image: mysql:5.7
environment:
- 'MYSQL_ROOT_PASSWORD=password'
volumes:
- 'db-data:/var/lib/mysql'
web:
build:
context: .
dockerfile: Dockerfile.nginx
volumes:
- ./public:/test-app/public
- ./tmp:/test-app/tmp
ports:
- 80:80
depends_on:
- app
volumes:
db-data:
terminal
$ docker-compose run --rm app rails new . --force --database=mysql --skip-bundle
Erstellen Sie zunächst einen Sockets-Ordner im tmp-Ordner.
Bearbeiten Sie anschließend die folgenden drei von Rails Setup erstellten Dateien.
config/database.yml
config/puma.rb
config/environments/production.rb
config/database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password #docker-compose.yml MYSQL_ROOT_Stellen Sie den Wert von PASSWORD ein
host: db #docker-compose.Übereinstimmung mit dem Namen des yml-Dienstes
development:
<<: *default
database: test-app_development
config/puma.rb
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count
port ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
plugin :tmp_restart
app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"
stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
config/environments/production.rb
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = true #Der Standardwert ist false. Ändern Sie ihn daher in true
Es gibt kein Problem beim Erstellen der Entwicklungsumgebung, ohne diese config / environment / Production.rb
zu ändern, aber ich habe beim Bereitstellen in der Produktionsumgebung einen Fehler beim Vorkompilieren von Assets erhalten, daher habe ich ihn hier geändert Es ist.
terminal
$ docker-compose up -d --build
$ docker-compose exec app rails db:create
Wenn Sie jetzt http: // localhost besuchen, sollte der Rails-Startbildschirm angezeigt werden.