[RUBY] J'ai essayé de migrer le portfolio créé sur Vagrant vers l'environnement de développement de Docker

introduction

Ravi de vous rencontrer, c'est mon premier article, alors j'aimerais écrire sur moi-même et la raison de l'article.

Que faire dans cet article

--Construire un environnement de développement à l'aide de Docker C'est une image qui permet de faire ce qui a été fait sur Vagrant sur Docker

--Notation telle que Dockerfile, docker-compose, etc. Pour référence, l'environnement de développement lors de l'utilisation de Vagrant est le suivant

スクリーンショット 2020-09-13 12.40.05.png

—— Erreurs possibles lors de la création d'un environnement de développement à partir de 0 et comment les résoudre Comme mentionné au début de l'article, il y avait des erreurs avant docker car c'était la première fois que l'on construisait un environnement local. Je voudrais principalement présenter les articles auxquels j'ai fait référence pour la solution.

Non couvert dans cet article

Préparation préalable

--Installation de Docker Faisons-le depuis ce site officiel https://hub.docker.com/editions/community/docker-ce-desktop-mac
Ce n'est pas grave si vous pouvez vérifier la version dans le terminal


$ docker version
Client: Docker Engine - Community
 Cloud integration  0.1.18
 Version:           19.03.13
 API version:       1.40

--Git cloner le portefeuille (le projet que vous souhaitez utiliser comme environnement de développement Docker) Comme vous pouvez le voir au début de l'article, apportons ce que vous voulez pour construire l'environnement localement à partir de github car vous êtes déjà au stade de la création d'un portefeuille.

$ mkdir docker
 #Exécuter depuis le bureau ou dans le répertoire de travail lors de l'utilisation de vagrant
$ git clone [email protected]:Nom d'utilisateur/Nom du référentiel.git

Préparation de chaque dossier

Maintenant que le Docker et le projet sont prêts, nous allons créer les fichiers nécessaires à la construction de l'environnement.

①Dockerfile


#Sur le répertoire que vous venez de cloner
$ touch Dockerfile

Remplissons le contenu suivant

#Spécifiez l'image du menu fixe d'origine. Correspondre à la version rubis de votre portfolio
FROM ruby:2.5.7

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

RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
#Spécifiez sqlite3
RUN apt-get update && apt-get install -y sqlite3 --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

#Créez le répertoire myapp dans le conteneur lorsque vous démarrez le conteneur
RUN mkdir /myapp

#Spécifier le répertoire de travail dans le conteneur(Répertoire créé par RUN ci-dessus)
WORKDIR /myapp

#Copiez le fichier gem de la machine hôte et collez-le dans le répertoire à l'intérieur du conteneur
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

#Lisez le gemfile collé. Ceci est requis si la version du bundler est 2 ou ultérieure
ENV BUNDLER_VERSION 2.1.4
RUN gem install bundler
RUN bundle install

#application(Répertoire actuel)Et collez-le dans un répertoire à l'intérieur du conteneur
COPY . /myapp

#Publier le port à 3000
EXPOSE 3000

#Exécuter la commande dans le conteneur
CMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]

--À propos de ENV BUNDLER_VERSION 2.1.4 Je pense qu'il y a une telle notation au bas de Gefile.lock, alors veuillez la vérifier.

Gemfile.lock


BUNDLED WITH
   2.1.4

②docker-compose.yml


#Sur le même répertoire
$ touch docker-compose.yml

Remplissons le contenu suivant

docker-compose.yml


version: '3'
services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile 
    #Spécifiez le fichier pour enregistrer les modifications
    volumes:
      - .:/myapp
    #Spécifiez le port
    ports:
      - "3000:3000"
    #Gardez le conteneur en marche
    tty: true
    stdin_open: true

Si vous utilisez MySQL ou PostgreSQL, vous devez écrire web + DB, mais dans le cas de SQLite, c'est tout ce dont vous avez besoin. Je n'ai pas encore beaucoup de connaissances dans ce domaine, alors j'aimerais éventuellement passer à MySQL ...

Commençons le conteneur

#Créer une image Docker basée sur un Dockerfile
$ docker-compose build 

#Démarrer le conteneur Docker en arrière-plan
$ dokcer-compose up -d

#Mettre à jour la migration dans le conteneur
docker-compose run web rails db:migrate

Maintenant, si vous pouvez l'afficher à l'habituel [localhost: 3000](http: // localhost: 3000 /), c'est un paragraphe!

Erreur détectée et comment la résoudre

En général, je les énumérerai par ordre chronologique. Comme mentionné au début, le contenu de l'erreur et la considération de la cause probable sont inférieurs, et l'article principal est l'introduction de l'article qui a servi de référence pour la résolution. Merci beaucoup

①ActiveRecord::PendingMigrationError Migrations are pending "Cela fonctionne avec docker-compose up -d ...!"

$ docker-compose up -d                                                  
Creating network "~~~_default" with the default driver
Creating ~~~_web_1 ... done

Il s'agit d'une erreur qui s'est produite lors de l'accès à la page sur localhost: 3000. Après avoir démarré le conteneur, faisons docker-compose run web rails db: migrate, j'ai l'impression qu'il y a Référence: ActiveRecord :: PendingMigrationError Les migrations sont en attente dans Rails lancées avec docker-compose up

②To install the missing version, run 'gem install bundler:2.1.4' "Je ne peux pas faire de commandes commençant par bundle (deploy, Rspec, etc.) ...!"

Traceback (most recent call last):
    2: from 
    1: from 
~
Could not find 'bundler' (2.1.4) required by your /Users/Nom d'utilisateur/Nom du répertoire/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.1.4`

C'est une image que "BUNDLED WITH 2.1.4" de Gemfile.lock, qui a été confirmée lors de la création du Dockerfile, ne peut pas être trouvée localement. Référence: Pour installer la version manquante, exécutez gem install bundler: 2.1.4 Que faire quand il apparaît

Essayez d'installer selon l'instruction d'erreur, si cela échoue, allez à

gem install bundler -v 2.1.4

③ERROR: While executing gem ... (Gem::FilePermissionError)

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.

"Vous n'avez pas la permission d'installer des gemmes ...!" Il y avait beaucoup d'articles sur le faire avec sudo à l'esprit, mais je pense qu'il vaut mieux penser à l'avenir en utilisant un outil de gestion de version appelé "rbenv" plutôt que de l'installer tel quel.

Référence 1: Que faire lorsqu'une erreur d'autorisation se produit lors de l'installation de gem Référence 2: De l'installation de Ruby par rbenv à Hello, World!

Quand rbenv est prêt, essayons à nouveau

gem install bundler -v 2.1.4

④ Je ne peux pas grouper l'installation

"Bundle ... toujours inutile ...!"

Lorsque l'installation de gem est terminée, lorsque j'entre dans le système "bundle ~" tel que deploy, un message d'erreur apparaît toujours.

Install missing gem executables with `bundle install`

Lorsque j'essaye d'installer le bundle selon l'instruction d'erreur

#Parce que c'est long, seule la dernière partie est extraite
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2

C'est une erreur autour de mysql, mais je n'en connaissais pas la cause par moi-même. J'ai pu le résoudre selon l'article auquel j'ai fait référence ci-dessous, je suis vraiment reconnaissant.

Référence: [Rails] Que faire lorsque MySQL2 ne peut pas regrouper l'installation

Je pense que vous pouvez maintenant déployer.

⑤Could not find a JavaScript runtime ~

"Ça marche ...!"

Il s'agit d'une erreur lors de l'exécution de Rspec

$ bundle exec rspec spec/ --format documentation

An error occurred while loading ./spec/models/cart_item_spec.rb.
Failure/Error: require File.expand_path('../config/environment', __dir__)

ExecJS::RuntimeUnavailable:
  Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.

Si vous volez vers github, il vous recommande de télécharger l'un des ExecJS. Il y avait un moyen d'insérer une gemme, mais si je sélectionnais Node.js et procédais au téléchargement, le problème était résolu sans problème.

Maintenant, vous pouvez également faire Rspec.

À la fin

Nous avons présenté la procédure et les erreurs de migration de vagrant à docker. Il y a encore de nombreux endroits où je n'ai pas suffisamment étudié, alors j'ai pensé à nouveau qu'il y a de nombreux points où je n'ai pas pleinement utilisé docker. Puisqu'il y avait de nombreux articles auxquels j'ai fait référence, j'ai pu le présenter en moins de temps que je ne le pensais au départ, donc je pense que c'était bien de l'essayer.

Maintenant que nous pouvons faire la même chose que l'environnement vagabond précédent, nous aimerions continuer à apprendre à améliorer l'environnement de développement avec l'introduction de CircleCI.

Comme c'était mon premier post, je pense que c'était difficile à comprendre, mais merci d'avoir regardé jusqu'au bout!

Recommended Posts

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 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 padrino avec Docker
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé de créer un environnement de développement Spring MVC sur Mac
[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.
Comment vérifier l'application WEB créée dans l'environnement de développement PC sur votre smartphone
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé d'expliquer la méthode
Créer un environnement de développement Unity sur docker
Conférence spéciale sur la simulation multi-échelles: j'ai essayé de résumer le 5e
J'ai essayé de créer un environnement de développement http2 avec Eclipse + Tomcat
Remarques sur la création de l'environnement de développement de Kotlin et la migration de Java vers Kotlin
Conférence spéciale sur la simulation multi-échelles: j'ai essayé de résumer le 8
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
Étapes pour créer un environnement de développement Ruby on Rails avec Vagrant
Création d'un environnement de développement Spring Boot dans Vagrant
J'ai essayé de résumer les méthodes utilisées
J'ai essayé de migrer le traitement vers VS Code
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé de résumer l'API Stream
J'ai essayé de construire AdoptOpenjdk 11 sur CentOS 7
Qu'est-ce que Docker? J'ai essayé de résumer
Créer un environnement de développement Ultra96v2 sur Docker 1
Problèmes auxquels j'étais accro lors de la création de l'environnement digdag avec docker
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 6.x)
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 5.x)
J'ai essayé de publier l'application de mesure réflexe sur le Google Play Store
J'ai essayé de créer un portefeuille avec AWS, Docker, CircleCI, Laravel [avec lien de référence]
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
[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
Améliorer les performances de l'environnement de développement Docker
Je souhaite créer l'environnement de développement local le plus solide à l'aide de conteneurs distants VSCode
Créez un environnement de développement pour créer des applications Ruby on Jets + React avec Docker
J'ai essayé de configurer tomcat pour exécuter le servlet.
Lorsque j'ai essayé de reproduire l'application Rails de Progate sur mon PC (environnement local), je suis resté bloqué sur l'affichage de l'image
Comment quitter Docker pour Mac et créer un environnement de développement Docker avec Ubuntu + Vagrant
Introduction au développement de modules Slay the Spire (2) Construction de l'environnement de développement