Bonjour. Cette fois également, j'ai résumé la procédure de création d'un environnement de développement d'applications Rails avec Docker. La dernière fois, j'ai démarré deux conteneurs, un pour Rails et un pour la base de données, mais cette fois j'ai également démarré le conteneur Nginx en tant que serveur Web.
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
La configuration générale est la suivante. Maintenant, créons des répertoires et des fichiers comme indiqué dans ce diagramme de configuration.
Composition globale
/test-app
├── Dockerfile
├── Dockerfile.nginx
├── docker-compose.yml
├── nginx.conf
├── Gemfile
└── Gemfile.lock
Commencez par créer le répertoire racine de votre projet.
terminal
$ mkdir test-app
Et directement sous le répertoire racine
Dockerfile
Dockerfile.nginx
docker-compose.yml
nginx.conf
Gemfile
Gemfile.lock
Créez-les.
terminal
$ cd test-app
$ touch Dockerfile Dockerfile.nginx docker-compose.yml nginx.conf Gemfile Gemfile.lock
Le contenu de chaque fichier créé ci-dessus est le suivant. (Laissez Gemfile.lock vide.)
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
#Spécification de la destination du proxy
#Envoyez la demande reçue par Nginx au backend puma
upstream test-app {
#Je veux communiquer avec des prises, donc puma.Spécifier la chaussette
server unix:///test-app/tmp/sockets/puma.sock;
}
server {
listen 80;
#Spécifiez le domaine ou l'adresse IP
server_name _;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
#Spécifier la racine du document
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;
#Paramètres liés au proxy inverse
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
Tout d'abord, créez un dossier sockets
dans le dossier tmp.
Modifiez ensuite les trois fichiers suivants créés par Rails Setup.
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_Définissez la valeur de PASSWORD
host: db #docker-compose.Correspondance avec le nom du service yml
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 #La valeur par défaut est false, alors changez-la en true
Il n'y a pas de problème pour créer l'environnement de développement sans changer ce config / environnements / production.rb
, mais j'ai eu une erreur de précompilation d'actif lors du déploiement dans l'environnement de production, donc je l'ai changé ici Il est.
terminal
$ docker-compose up -d --build
$ docker-compose exec app rails db:create
Maintenant, lorsque vous visitez http: // localhost, vous devriez voir l'écran d'accueil de Rails.
Recommended Posts