[Rails 6.0, Docker] J'ai essayé de résumer la construction de l'environnement Docker et les commandes nécessaires pour créer un portfolio

Je voudrais résumer les commandes et la construction d'environnement dont j'avais besoin pour créer un portfolio avec Rails. Cela n'est nécessaire qu'au niveau de la création de portefeuille.

Aperçu

  1. Commandes fréquemment utilisées pour gérer docker-compose
  2. Description de divers fichiers (Dockerfile, docker-compose.yml, database.yml)

1. Commandes fréquemment utilisées pour gérer docker-compose

commande rails (utilisateurs du modèle rails g, rails db: migrate, etc.)

terminal


$ docker compose run --rm web <commande rails>

L'option --rm est une commande pour supprimer le conteneur après l'exécution. Si vous ne l'attachez pas, un conteneur inutile sera créé et il exercera une pression sur la mémoire, alors assurez-vous de le joindre.

Connectez-vous à l'entrée / sortie standard (ce qui est affiché sur le terminal lors du développement local)

terminal


$ docker attach <Nom du conteneur du serveur Web>

Vous pouvez vérifier l'état de la communication en vous connectant à l'entrée / sortie standard sur le serveur. Cette commande est également utilisée lors du débogage avec binding.pry. Détachez avec un traitement approprié. (Ctrl + C provoquera la chute du conteneur)

Ctrl + P, Ctrl + Q

Se connecter à la base de données (mysql)

terminal


$ docker exec -it <nom du conteneur de base de données> bash

De l'intérieur du conteneur

terminal


$ mysql -u root -p

Créez une image Docker, démarrez et exécutez le conteneur.

terminal


$ docker-compose stop
#Dockerfile ou docker-compose.Après correction yml
$ docker-compose up -d --build

Pour lors de la modification de Dockerfile ou docker-compose.yml.

Supprimer la commande

Même avec l'option --rm, les conteneurs et les images que vous n'avez pas besoin de développer s'accumulent. Voici la commande pour les supprimer.

Supprimer en masse les conteneurs arrêtés, les images non balisées, les volumes inutilisés et les réseaux inutilisés

terminal


docker system prune

Suppression groupée des conteneurs arrêtés

terminal


docker container prune

Supprimer les images inutilisées en masse

terminal


docker image prune

Description de divers fichiers

Dockerfile Tout d'abord, le Dockerfile. Tout d'abord, lisez le document officiel. https://docs.docker.com/compose/rails/

Dockerfile


FROM ruby:2.7.1

#Installation de Debian
RUN 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

RUN apt-get update -qq && apt-get install -y nodejs yarn imagemagick mariadb-client vim

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

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"]

Installation de fil

À partir de rails 6.0, le compilateur JavaScript a été changé en webpacker et yarn, qui est le gestionnaire de packages requis pour installer webpacker, est installé.

Installez ImageMagick

Installé parce que je voulais utiliser MiniMagic pour le téléchargement d'images. Si vous souhaitez utiliser MiniMagick avec une application Rails, vous devez installer ImageMagick dans l'environnement où l'application Rails s'exécute. Ce qui suit est tiré de Lisez-moi de minimagic

ImageMagick or GraphicsMagick command-line tool has to be installed. You can check if you have it installed by running

Installation de mariadb-client

Installez si vous souhaitez utiliser les rails db: consol. Il y a un article qui dit mysql-client, mais attention car il est maintenant unifié à mariadb-client. Cela peut ne pas être nécessaire car vous pouvez accéder à la base de données avec la commande ci-dessus

installer vim

Installez l'éditeur car vous en aurez besoin. Après avoir déployé l'application dans l'environnement de production, je voulais modifier credentials.yml.enc avec la commande suivante, mais j'ai utilisé vim à ce moment-là.

terminal


$ docker-compose run -e EDITOR=vim web rails credentials:edit

docker-compose.yml Vient ensuite docker-compose.yml

docker-compose.yml


version: "3"
services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 4306:3306
    
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql

  web:
    build: .
    tty: true
    stdin_open: true
    #Un serveur est déjà en cours d'exécution lorsque les rails s.Peut apparaître. Pour éviter cela, rm-f tmp/pids/server.C'est pide.
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
      - bundle:/usr/local/bundle
    ports:
      - "3100:3000"
    depends_on:
      - db

volumes:
  bundle:
    driver: local
  mysql-data:
    driver: local

Réglage du numéro de port

docker-compose.yml


db
  ports:
    - 4306:3306
web
  ports:
    - 3100:3000

Le numéro de port de la machine hôte est à gauche et le numéro de port du conteneur est à droite. Si MySQL est (LISTEN) sur l'hôte ou si vous souhaitez utiliser localhost: 3000, définissez les numéros de port utilisés par la machine sur 4306 et 3100, respectivement, car les ports utilisés sont dupliqués. Si vous ne le portez pas, vous pouvez utiliser 3307 ou 10000.

Méthode d'authentification mysql modifiée

docker-compose.yml


command: --default-authentication-plugin=mysql_native_password

La méthode d'authentification par défaut a changé depuis MySQL 8.0 (caching_sha2_password), mais comme l'application Rails ne la prend pas encore en charge, changez-la en mysql_native_password.

Activer l'entrée standard

docker-compose.yml


tty: true
stdin_open: true

Très important pour le débogage. Si vous ne le faites pas, vous ne pourrez pas effectuer de binding.pry etc. tty: true Correspond à l'option -t de docker run et est un paramètre qui active les pseudo terminaux. Même s'il est activé, il ne peut pas être entré, donc stdin_open: true ci-dessous est toujours inclus comme un ensemble. stdin_open: true Un paramètre qui correspond à l'option -i de docker run et maintient l'entrée standard connectée. Cela permet d'exécuter des commandes.

Contrôler l'ordre de démarrage des conteneurs

docker-compose.yml


depends_on:
      - db

Contrôlez l'ordre dans lequel les conteneurs sont démarrés avec depend_on (dans ce cas, db → web)

Création d'un conteneur de volume de données

docker-compose.yml


volumes:
  bundle:
    driver: local
  mysql-data:
    driver: local

Normalement, si vous recréez le conteneur, toutes les données des fichiers installés et de la base de données du bundle seront supprimées, vous devrez donc reconstruire ou enregistrer les données. C'est trop ennuyeux d'utiliser un conteneur de volume de données. Le conteneur Volume de données est un conteneur qui ne contient que des données et utilise un mécanisme de partage entre conteneurs. Les paramètres pour créer ceci avec le bundle de noms et mysql-data sont comme ci-dessus.

Monter au volume

docker-compose.yml


volumes:
  - mysql-data:/var/lib/mysql
volumes:
  - .:/myapp
  - bundle:/usr/local/bundle

Conserver les données à l'aide du conteneur Data Volume créé précédemment. Désormais, même si vous détruisez le conteneur et le reconstruisez, les données de la base de données resteront telles quelles et le Gem sera installé et prêt à être utilisé.

database.yml Enfin database.yml

database.yml


default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
  host: <%= ENV.fetch("MYSQL_HOST", "db") %>

development:
  <<: *default
  database: myapp_development

Code de caractère

database.yml


encoding: utf8mb4

Je voulais enregistrer des pictogrammes dans la base de données, j'ai donc changé le code de caractère en utf8mb4 au lieu de utf8.

Veuillez me faire savoir s'il existe d'autres paramètres ou commandes utiles ^^

référence

https://docs.docker.com/compose/rails/ Introduction au développement pratique de conteneurs Docker / Kubernetes https://qiita.com/neko-neko/items/abe912eba9c113fd527e https://qiita.com/chisaki0606/items/68e21d9a31f1eaaeac00 https://qiita.com/nsy_13/items/9fbc929f173984c30b5d

Recommended Posts

[Rails 6.0, Docker] J'ai essayé de résumer la construction de l'environnement Docker et les commandes nécessaires pour créer un portfolio
[Première construction d'environnement] J'ai essayé de créer un environnement Rails6 + MySQL8.0 + Docker sur Windows 10.
J'ai essayé de créer un environnement de développement padrino avec Docker
[Docker] Comment créer un environnement virtuel pour les applications Rails et Nuxt.js
J'ai essayé de migrer le portfolio créé sur Vagrant vers l'environnement de développement de Docker
J'ai essayé de créer un portefeuille avec AWS, Docker, CircleCI, Laravel [avec lien de référence]
J'ai essayé de créer une application d'apprentissage automatique avec Dash (+ Docker) part1 ~ Construction de l'environnement et vérification du fonctionnement ~
J'ai essayé d'utiliser Wercker pour créer et publier une image Docker qui lance GlassFish 5
J'ai essayé de résumer les bases de kotlin et java
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
J'ai essayé de créer un React.js x TypeScript x Material-UI sur un environnement docker
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé de créer un environnement de développement Spring MVC sur Mac
J'ai essayé de résumer les méthodes de Java String et StringBuilder
J'ai essayé de résumer les méthodes utilisées
J'ai essayé de résumer l'API Stream
Qu'est-ce que Docker? J'ai essayé de résumer
J'ai construit un environnement de rails avec docker et mysql, mais j'étais malade
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
[Construction de l'environnement Rails & Docker & MySQL] J'ai démarré le conteneur, mais je ne trouve pas MySQL ...?
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
Présentez Docker à l'environnement de développement et à l'environnement de test des applications Rails et MySQL existantes
Construction de l'environnement Rails Docker
J'ai essayé de créer une compétence Clova en Java
Rails6 J'ai essayé d'introduire Docker dans une application existante
J'ai essayé de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
Méthode de construction de l'environnement et dépanneur au moment du développement conjoint (rails, docker et github)
[Rails] [Docker] Le copier-coller est OK! Comment créer un environnement de développement Rails avec Docker
J'ai essayé de créer une fonction de message de l'extension Rails Tutorial (Partie 1): Créer un modèle
Commande Docker pour créer un projet Rails avec un seul coup dans l'environnement sans Ruby
J'ai essayé d'exprimer le numéro de téléphone (téléphone fixe / téléphone portable) avec une expression régulière dans Rails et d'écrire la validation et le test
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
J'ai essayé node-jt400 (Construction de l'environnement)
Je veux appeler une méthode et compter le nombre
J'ai essayé JAX-RS et pris note de la procédure
Une série d'étapes pour créer des livrables pour les portefeuilles avec Rails
J'ai brièvement résumé la grammaire de base de Ruby
[Docker] Construction de l'environnement Rails 5.2 avec docker
J'ai essayé de résumer les applications et les outils de développement personnellement utiles (outils de développement)
[Pour les débutants Swift] J'ai essayé de résumer le cycle de mise en page désordonné de ViewController et View
J'ai essayé de résumer les applications et les outils de développement personnellement utiles (Apps)