[RUBY] [Rails] Comment créer un environnement avec Docker

Environnement de développement

・ Docker: 19.03.8 ・ Docker-Compose: 1.25.5 ・ Rubis: 2.5.7 Rails: 5.2.4 ・ Vagrant: 2.2.7 -VirtualBox: 6.1 ・ Système d'exploitation: macOS Catalina

la mise en oeuvre

1. Créer / déplacer le répertoire de travail

Le nom du dossier sera myapp (tout va bien).

Terminal


$ mkdir myapp

Terminal


$ cd myapp

2. Créez / modifiez Dockerfile

Terminal


$ vi Dockerfile

Dockerfile


FROM ruby:2.7.1
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

#Ajout d'un script qui s'exécute à chaque démarrage du conteneur
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

#Démarrer le processus principal
CMD ["rails", "server", "-b", "0.0.0.0"]

[Explication]

★ Aperçu

FROM: définir l'image et la version à utiliser RUN: Exécuter la commande WORKDIR: Définit le répertoire de travail COPY: Copie les fichiers locaux dans le conteneur ʻENTRYPOINT: Définit la commande à exécuter en premier ʻEXPOSE: Définissez le numéro de port sur lequel le conteneur écoute CMD: exécution du logiciel à l'intérieur de l'image

★ Détails

** ◎ Obtenez la dernière version stable au 19 juillet 2020 comme image à utiliser. ** **

FROM ruby:2.7.1

** ◎ Installez les packages Node.js et PostgreSQL. ** **

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

** ◎ Créez un répertoire myapp dans le conteneur. ** **

RUN mkdir /myapp

** ◎ Définissez le répertoire de travail sur myapp créé ci-dessus **

WORKDIR /myapp

** ◎ Copiez le Gemfile local dans myapp dans le conteneur. ** **

COPY Gemfile /myapp/Gemfile

** ◎ Copiez le Gemfile.lock local dans myapp dans le conteneur. ** **

COPY Gemfile.lock /myapp/Gemfile.lock

** ◎ Exécutez bundle install. ** **

RUN bundle install

** ◎ Copiez le répertoire actuel (local myapp) dans myapp dans le conteneur. ** **

COPY . /myapp

** ◎ Copiez le ʻentrypoint.sh local dans ʻusr / bin dans le conteneur. ** **

COPY entrypoint.sh /usr/bin/

** ◎ Autorise l'accès à ʻentrypoint.sh` copié ci-dessus. ** **

RUN chmod +x /usr/bin/entrypoint.sh

** ◎ Définissez ʻentrypoint.sh` comme première commande à être exécutée lorsque le conteneur est démarré. ** **

ENTRYPOINT ["entrypoint.sh"]

** ◎ Réglez le numéro de port sur «3000». ** **

EXPOSE 3000

** ◎ Lancez le serveur Rails. ** **

CMD ["rails", "server", "-b", "0.0.0.0"]

3. Créez / modifiez Gemfile

Spécifiez la version de Rails. Cette fois, nous le rendrons compatible avec Rails 6.

Terminal


$ vim Gemfile

Gemfile


source 'https://rubygems.org'
gem 'rails', '~> 6'

4. Créez Gemfile.lock

Terminal


$ touch Gemfile.lock

5. Créez / éditez ʻentrypoint.sh`

Terminal


$ vi entrypoint.sh

entrypoint.sh


#!/bin/bash
set -e

#Serveur de fichiers compatible Rails.Supprimez le pid tel qu'il peut exister.
rm -f /myapp/tmp/pids/server.pid

#Exécutez le processus du conteneur. (Celui défini dans CMD dans le Dockerfile.)
exec "$@"

5. Créez / modifiez docker-compose.yml

Terminal


$ vi docker-compose.yml

docker-compose.yml


version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

[Explication]

version: définit la version de docker-compose. services: Créez des services dans le hachage ci-dessous. Vous pouvez le nommer librement, mais généralement vous le nommez web et db. ʻImage: image à utiliser (spécifiez PostgreSQL dans la base de données) volumes: paramètres de montage du répertoire (les données de base de données, etc. peuvent être laissées) build: Chemin avec Dockerfile etc. (essentiellement le répertoire actuel) command: Commande (supprimez le fichier server.pid puis démarrez le serveur rails) ports: numéro de port (hôte: défini dans le conteneur) depend_on`: Affiche les dépendances et vous permet de spécifier l'ordre de démarrage. Ici, commencez par db → web.

6. Vérifiez la structure des répertoires

Terminal


myapp
- Dockerfile
- Gemfile
- Gemfile.lock
- entrypoint.sh
- docker-compose.yml

7. Construisez le projet

Terminal


$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bundle

[Explication]

--force: écraser Gemfile --no-deps: ne démarre pas le service lié --database = postgresql: Spécifiez PostgreSQL pour DB --skip-bundle: Ignorer le bundle

8. Exécutez bundle install

Terminal


Could not find gem 'pg (>= 0.18, < 2.0)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.

Je pense que l'erreur ci-dessus s'est produite dans 7, alors exécutez la commande suivante pour la résoudre. Il `` bundle install '' lorsque vous construisez l'image Docker.

Terminal


$ docker-compose build

9. Modifiez database.yml

config/database.yml


#Changer avant
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

#Après le changement
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

10. Démarrez le conteneur

Terminal


$ docker-compose up

* Si l'erreur suivante se produit

Terminal


Error: No such file or directory @ rb_sysopen - /myapp/config/webpacker.yml (RuntimeError)

Créer / éditer webpacker.yml

Terminal


touch config/webpacker.yml

webpacker.yml


# Note: You must restart bin/webpack-dev-server for changes to take effect

default: &default
  source_path: app/javascript
  source_entry_path: packs
  public_root_path: public
  public_output_path: packs
  cache_path: tmp/cache/webpacker
  webpack_compile_output: true

  # Additional paths webpack should lookup modules
  # ['app/assets', 'engine/foo/app/assets']
  additional_paths: []

  # Reload manifest.json on all requests so we reload latest compiled packs
  cache_manifest: false

  # Extract and emit a css file
  extract_css: true

  static_assets_extensions:
    - .jpg
    - .jpeg
    - .png
    - .gif
    - .tiff
    - .ico
    - .svg
    - .eot
    - .otf
    - .ttf
    - .woff
    - .woff2

  extensions:
    - .mjs
    - .js
    - .sass
    - .scss
    - .css
    - .module.sass
    - .module.scss
    - .module.css
    - .png
    - .svg
    - .gif
    - .jpeg
    - .jpg

development:
  <<: *default
  compile: true

  # Set to false if using HMR for CSS
  extract_css: true

  # Reference: https://webpack.js.org/configuration/dev-server/
  dev_server:
    https: false
    host: localhost
    port: 3035
    public: localhost:3035
    hmr: false
    # Inline should be set to true if using HMR
    inline: true
    overlay: true
    compress: true
    disable_host_check: true
    use_local_ip: false
    quiet: false
    pretty: false
    headers:
      'Access-Control-Allow-Origin': '*'
    watch_options:
      ignored: '**/node_modules/**'

test:
  <<: *default
  compile: true

  # Compile test packs to a separate directory
  public_output_path: packs-test

production:
  <<: *default

  # Production depends on precompilation of packs prior to booting for performance.
  compile: false

  # Cache manifest.json for performance
  cache_manifest: true

11. Créer une base de données

Terminal


docker-compose run web rake db:create

* Si l'erreur suivante se produit

Terminal


could not translate host name "db" to address: Name or service not known

Terminal


Error: Database is uninitialized and superuser password is not specified.

Modifier docker-compose.yml

docker-compose.yml


#Changer avant
environment:
  POSTGRES_PASSWORD: password

#Après le changement
environment:
  - POSTGRES_HOST_AUTH_METHOD=trust

Recommended Posts

[Rails] Comment créer un environnement avec Docker
Comment créer un environnement Rails 6 avec Docker
Comment créer un environnement Docker avec Gradle pour IntelliJ
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ Express ~
[Rails] [Docker] Le copier-coller est OK! Comment créer un environnement de développement Rails avec Docker
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ MySQL ~
Comment installer Pry après avoir créé un environnement de développement Rails avec Docker
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ Sequelize ~
Comment créer une API avec GraphQL et Rails
Créer un environnement Docker avec WSL
Comment pousser une application développée avec Rails vers Github
Créez un environnement Ruby2.7.x + Rails6.0.x + MySQL8.0.x avec Docker
Comment créer un environnement de développement Java avec VS Code
Créer un environnement local Couchbase avec Docker
[Résolution d'erreur] Se produit lors de la tentative de création d'un environnement pour le printemps avec docker
Créez un environnement Docker + Laravel avec Laradock
Comment créer CloudStack à l'aide de Docker
Comment démarrer Camunda avec Docker
Comment définir des variables d'environnement lors de l'utilisation de Payjp avec Rails
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment quitter Docker pour Mac et créer un environnement de développement Docker avec Ubuntu + Vagrant
Comment recadrer une image avec libGDX
Construction d'environnement de rails avec Docker (apocalypse personnelle)
Créer un environnement de développement PureScript avec Docker
Construire un environnement Rails 6 + MySQL avec Docker compose
[Docker] Création d'un environnement pour utiliser Hugo
Déployer sur heroku avec Docker (Rails 6, MySQL)
Créer un environnement de développement Wordpress avec Docker
Créer un environnement de développement Ultra96v2 sur Docker 1
Créer un environnement de vérification des opérations TensorFlow avec Docker
Comment exécuter Blazor (C #) avec Docker
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
Le super débutant construit Rails 6 + environnement Postgresql avec Docker jusqu'à la fin
J'ai essayé de créer un environnement de développement http2 avec Eclipse + Tomcat
Étapes pour créer un environnement de développement Ruby on Rails avec Vagrant
Créer un environnement de débogage sur un conteneur - Créer un environnement de développement local pour les didacticiels Rails avec Docker -
Créer un environnement de développement pour Docker + Rails6 + Postgresql
Rétrograder une application existante créée avec les rails 5.2.4 vers 5.1.6
Comment écrire des rails
Comment lier Rails6 Vue (à partir de la construction de l'environnement)
Construction de l'environnement Rails Docker
Créez un environnement de "développement d'API + vérification d'API à l'aide de Swagger UI" avec Docker
Créer un environnement Laravel / Docker avec VSCode devcontainer
Comment créer une application avec ruby on rails (en supposant que l'environnement a été construit)
Créez rapidement un environnement de développement WordPress avec Docker