[Rails 6] Ancrez les applications Rails existantes [Docker]

introduction

Hello,Qiita! :sunny: Cette fois, je vais mettre une application Rails existante sur Docker! C'est aussi simple que de déplacer l'environnement à l'intérieur d'un conteneur, Je suis resté un peu coincé avec l'installation de webpack et de fil, alors j'ai écrit un article! Orchestrons deux conteneurs, Rails et MySQL, avec docker-compose: musical_score: Allons-y! !! : baleine2:

Conditions préalables

Description de Dockerfile

Décrivez comme suit.

Dockerfile


FROM ruby:2.7.1

ENV BUNDLER_VERSION="2.1.4" \
    APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn \
    TZ=Asia/Tokyo

RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    mariadb-client \
    sudo \
    vim && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y yarn

WORKDIR /app

COPY Gemfile Gemfile.lock /app/

COPY . /app

RUN bundle install -j4 && \
    yarn upgrade && \
    rails webpacker:install && \
    yarn install --check-files

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

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

Que faites-vous

FROM Obtenez l'image officielle (cette fois Ruby version 2.7.1) depuis Docker Hub.

ENV Définissez les variables d'environnement.

APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn ↑ Vous pouvez masquer le message d'avertissement en écrivant ceci

RUN Exécutez la commande sur le conteneur Docker.

apt-get Cette commande signifie utiliser et gérer les paquets en utilisant la bibliothèque APT (Advanced Package Tool), qui est un système de gestion de paquets pour les distributions basées sur Debian (Debian et Ubuntu). Cette fois j'ai pris l'image de Ruby, mais ruby est installé sur l'image Debian. Puisque Debian utilise le noyau Linux, les commandes Linux peuvent être utilisées.

WORKDIR Définissez le répertoire de travail. Il peut être spécifié plusieurs fois dans le même Dockerfile, et le chemin enregistré dans ENV peut être utilisé.

COPY Copiez le nouveau fichier dans un dossier (les fichiers compressés ne seront pas développés).

ENTRYPOINT Exécutez la commande décrite.

EXPOSE Libérez un port spécifique.

CMD Définissez la valeur par défaut du conteneur à exécuter. Vous ne pouvez utiliser qu'une seule fois__ dans le même Dockerfile et vous pouvez définir un argument pour ENTRYPOINT. Le Dockerfile doit contenir au moins une fois ENTRYPOINT ou CMD. __

Description de docker-compose.yml

Décrivez comme suit.

docker-compose.yml


version: '3'

services:
  app:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
      - ./vendor/bundle:/myapp/vendor/bundle:delegated
    ports:
      - "19802:3000" # "Tout port:3000"À
    depends_on:
      - db
    tty: true
    stdin_open: true

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: "password"
    ports:
      - "19801:3306" #moi aussi,":3306"À
    volumes:
      - ./tmp/db:/var/lib/mysql

Que faites-vous

version Définissez la version de docker-compose à utiliser.

services Définissez chaque élément (service) pour exécuter l'application. (Cette fois, app et db)

build Exécutez le fichier de composition et spécifiez le chemin lors de sa création.

command Remplacez la commande par défaut.

volumes Spécifiez le chemin du fichier de configuration à monter.

ports Spécifiez le numéro de port lors du lancement de l'image Docker.

depends_on Spécifiez la dépendance entre les services.

environment Spécifiez les variables d'environnement.

tty: true Réglez le conteneur pour qu'il continue de fonctionner.

stdin_open: true Définissez les autorisations d'entrée / sortie standard dans le conteneur.

Description de entrypoint.sh

Décrivez comme suit.

entrypoint.sh


#!/bin/bash
set -e

#.Supprimer le fichier pid
rm -f /app/tmp/pids/server.pid

#Exécutez le processus principal du conteneur(Ce qui est défini comme CMD dans le Dockerfile)。
exec "$@"

Description de database.yml

Décrivez comme suit.

database.yml


default: &default
  adapter: mysql2
  pool: 5
  timeout: 5000 #Tout

development:
  <<: *default
  database: myapp_development
  username: root
  password: password
  host: db
  port: 3306

Vérification de Gemfile et Gemfile.lock

Cette fois, nous allons mettre l'application existante sur Docker, donc tout ce que nous avons à faire est de nous assurer que Gemfile et Gemfile.lock existent.

Lancer docker-compose

Au terminal docker-compose build Éxécuter.

Terminal


Successfully built ~
Successfully tagged ~

Est sortie, la construction est réussie.

prochain, docker-compose exec app bash Pour entrer dans le conteneur de l'application. ensuite, bundle exec rails db:create bundle exec rails db:migrate bundle exec rails db:seed Et tu as fini! : des lunettes de soleil:

À la fin

Merci d'avoir regardé jusqu'à la fin. Personnellement, c'est vraiment amusant de travailler à l'intérieur du conteneur. Je ne sais pas pourquoi. (Cela ressemble à une création) J'apprécierais également que vous me fassiez savoir si vous avez des expressions inappropriées.

À la prochaine! : fusée:

Recommended Posts

[Rails 6] Ancrez les applications Rails existantes [Docker]
Rails Docker-Partie 1-
Rails Docker ~ Partie 2 ~
Construction de l'environnement Rails Docker
Docker x Rails 6 (Mémo)
Rails6 J'ai essayé d'introduire Docker dans une application existante
Exécuter des rails à chaque fois dans le docker
[Docker] Construction de l'environnement Rails 5.2 avec docker
[Docker] À utiliser à tout moment avec Docker + Rails
Connexion Docker + rails + Vue.js refusée chez localhost
[SRE / Docker] Démarrer le contrôle avec Dockerize
Rails sur la procédure de construction de l'environnement Docker
[Construction de l'environnement avec Docker] Rails 6 et MySQL 8
Déployer des rails sur Docker vers heroku
[Docker] Comment créer un environnement virtuel pour les applications Rails et Nuxt.js