[RUBY] J'ai essayé de créer un environnement de développement padrino avec Docker

Je vois souvent des articles sur l'exécution de Ruby on Rails avec Docker, mais je ne vois pas tellement padrino, donc un mémo de la procédure lorsque je l'ai essayé après avoir étudié. Créer une image Docker est un peu fastidieux car le projet padrino g force un sous-répertoire.

Environnement de vérification

Windows10 Home Edition
VirtualBox 6.1.10

# Docker Host OS (CoreOS)
$ uname -a
Linux default 4.9.93-boot2docker #1 SMP Thu Jul 19 18:29:50 UTC 2018 x86_64 GNU/Linux

Docker version 18.06.1-ce, build e68fc7a
docker-compose version 1.20.1, build 5d8c71b

Aperçu de la procédure d'installation

  1. Créez d'abord une image Docker contenant le projet initial créé par padrino g project (appelée l'image de base)
  2. Créez un conteneur à partir de l'image base et copiez le dossier de projet initial sur le côté du système d'exploitation hôte avec docker cp.
  3. Créez une image qui écrase le projet du côté du système d'exploitation hôte en fonction de l'image base (appelée l'image ʻapp`)
  4. Les travaux de développement ultérieurs changeront le code source du projet sur le système d'exploitation hôte et recréeront l'image ʻapp`.

Puisque le sous-répertoire est créé par padrino g project, WORKDIR change avant et après la création du projet, donc la procédure ci-dessus est suivie.

Structure de répertoire initiale

Initialement, uniquement docker-compose.yml et Dockerfile dans le dossier padrino

padrino
|   docker-compose.yml
|   Dockerfile

docker-compose.yml

Contenu pour créer une image de base

docker-compose.yml


version: "3.4"
services:
  base: 
    build:
      context: .
      dockerfile: ./Dockerfile
      target: "padrino-base"
    image: takaya030/padrino-base
    ports: 
      - "3000:3000"
    working_dir: /workspace/myapp
    command: "bundle exec padrino s -h 0.0.0.0"

Dockerfile

C'est aussi le contenu pour créer une image de base

Dockerfile


FROM ruby:2.7.1 as padrino-base
LABEL maintainer "takaya030"

RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs && \
	apt-get clean && \
	rm -rf /var/lib/apt/lists/*

# insall padrino
RUN mkdir /workspace
WORKDIR /workspace
RUN bundle init && \
	echo 'gem "padrino"' >>Gemfile && \
	bundle config set path 'vendor/bundle' && \
	bundle install && \
	bundle exec padrino g project myapp -t rspec -e erb -c sass -s jquery -d activerecord && \
	rm -rf Gemfile Gemfile.lock .bundle vendor

# create project
WORKDIR /workspace/myapp
RUN bundle config set path 'vendor/install' && \
	bundle install

CMD ["true"]

Construire l'image de base

$ cd padrino
$ docker-compose build base

Vérifiez le fonctionnement de l'image de base

Démarrer le conteneur Docker

$ docker-compose up -d

Si vous accédez à http://192.168.99.100:3000/ avec un navigateur Web et que ce qui suit s'affiche, cela fonctionne correctement.

padrino_1.png

Arrêtez le conteneur une fois

$ docker-compose stop

Copiez le dossier du projet du côté du système d'exploitation hôte

Copiez le dossier du projet dans le conteneur arrêté du côté du système d'exploitation hôte Ceci est l'environnement de développement actuel

$ docker cp padrino_base_1:/workspace/myapp .

# "padrino_base_1"Est-ce le nom du conteneur que vous venez d'arrêter

Lorsque la copie est terminée, l'environnement de développement sera créé dans le dossier padrino / myapp /.

padrino
|   docker-compose.yml
|   Dockerfile
|   
\---myapp

Supprimer le conteneur lorsque la copie est terminée

$ docker-compose rm

ʻApp` Ajouter des paramètres pour la création d'image

docker-compose.yml

Passer au contenu suivant

docker-compose.yml


version: "3.4"
services:
  base: 
    build:
      context: .
      dockerfile: ./Dockerfile
      target: "padrino-base"
    image: takaya030/padrino-base
  app: 
    build:
      context: .
      dockerfile: ./Dockerfile
      target: "padrino-app"
    image: takaya030/padrino-app
    ports: 
      - "3000:3000"
    volumes:
      - ./myapp:/workspace/myapp
    working_dir: /workspace/myapp
    command: "bundle exec padrino s -h 0.0.0.0"

Dockerfile

Passer au contenu suivant

Dockerfile


FROM ruby:2.7.1 as padrino-base
LABEL maintainer "takaya030"

RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs && \
	apt-get clean && \
	rm -rf /var/lib/apt/lists/*

# insall padrino
RUN mkdir /workspace
WORKDIR /workspace
RUN bundle init && \
	echo 'gem "padrino"' >>Gemfile && \
	bundle config set path 'vendor/bundle' && \
	bundle install && \
	bundle exec padrino g project myapp -t rspec -e erb -c sass -s jquery -d activerecord && \
	rm -rf Gemfile Gemfile.lock .bundle vendor

# create project
WORKDIR /workspace/myapp
RUN bundle config set path 'vendor/install' && \
	bundle install

CMD ["true"]

#=========================================
FROM padrino-base as padrino-app

COPY ./myapp /workspace/myapp
WORKDIR /workspace/myapp

CMD ["bundle","exec","padrino","s","-h","0.0.0.0"]

Construction d'image ʻApp`

$ docker-compose build app

Vérification du fonctionnement de l'image ʻApp`

Démarrer le conteneur Docker

$ docker-compose up -d

Accédez à http://192.168.99.100:3000/ avec un navigateur Web et vérifiez que le même écran que précédemment s'affiche.

Confirmation de la réflexion des modifications du code source

Avec le conteneur en cours d'exécution, modifiez myapp / app / app.rb comme suit

myapp/app/app.rb


--- a/app.rb      Sat Jun 06 19:19:23 2020
+++ b/app.rb      Sat Jun 06 22:30:27 2020
@@ -62,5 +62,10 @@
     #     render 'errors/500'
     #   end
     #
+
+    get '/' do
+      "Hello World"
+    end
+
   end
 end

Si vous accédez à nouveau à http://192.168.99.100:3000/ avec un navigateur Web et qu'il s'affiche comme indiqué dans l'image ci-dessous, cela fonctionne normalement.

padrino_2.png

Comment ajouter un package de gemmes

Vérifier les packages actuellement installés

$ docker-compose run --rm app bundle list
Gems included by the bundle:
  * activemodel (6.0.3.1)
  * activerecord (6.0.3.1)
  * activesupport (6.0.3.1)
  * concurrent-ruby (1.1.6)
  * diff-lcs (1.3)
  * erubi (1.9.0)
  * ffi (1.13.0)
  * i18n (1.8.3)
  * mail (2.7.1)
  * mime-types (3.3.1)
  * mime-types-data (3.2020.0512)
  * mini_mime (1.0.2)
  * minitest (5.14.1)
  * moneta (1.1.1)
  * mustermann (1.1.1)
  * padrino (0.15.0)
  * padrino-admin (0.15.0)
  * padrino-cache (0.15.0)
  * padrino-core (0.15.0)
  * padrino-gen (0.15.0)
  * padrino-helpers (0.15.0)
  * padrino-mailer (0.15.0)
  * padrino-support (0.15.0)
  * rack (2.2.2)
  * rack-protection (2.0.8.1)
  * rack-test (1.1.0)
  * rake (13.0.1)
  * rb-fsevent (0.10.4)
  * rb-inotify (0.10.1)
  * rspec (3.9.0)
  * rspec-core (3.9.2)
  * rspec-expectations (3.9.2)
  * rspec-mocks (3.9.1)
  * rspec-support (3.9.3)
  * ruby2_keywords (0.0.2)
  * sass (3.7.4)
  * sass-listen (4.0.0)
  * sinatra (2.0.8.1)
  * sqlite3 (1.4.2)
  * thor (0.20.3)
  * thread_safe (0.3.6)
  * tilt (2.0.10)
  * tzinfo (1.2.7)
  * zeitwerk (2.3.0)
Use `bundle info` to print more detailed information about a gem

Décrivez le package que vous souhaitez ajouter à myapp / Gemfile

myapp/Gemfile


--- a/Gemfile     Sat Jun 06 19:19:23 2020
+++ b/Gemfile     Sun Jun 07 21:57:33 2020
@@ -22,6 +22,10 @@
 gem 'activerecord', '>= 3.1', :require => 'active_record'
 gem 'sqlite3'

+# OAuth
+gem "omniauth"
+gem "omniauth-twitter"
+
 # Test requirements
 gem 'rspec', :group => 'test'
 gem 'rack-test', :require => 'rack/test', :group => 'test'

Installez le package avec la commande suivante

$ docker-compose run --rm app bundle install

Vérifiez s'il a été installé avec succès (Confirmez que les packages liés à ʻomniauth` ont été ajoutés)

$ docker-compose run --rm app bundle list
Gems included by the bundle:
  * activemodel (6.0.3.1)
  * activerecord (6.0.3.1)
  * activesupport (6.0.3.1)
  * concurrent-ruby (1.1.6)
  * diff-lcs (1.3)
  * erubi (1.9.0)
  * ffi (1.13.0)
  * hashie (4.1.0)
  * i18n (1.8.3)
  * mail (2.7.1)
  * mime-types (3.3.1)
  * mime-types-data (3.2020.0512)
  * mini_mime (1.0.2)
  * minitest (5.14.1)
  * moneta (1.1.1)
  * mustermann (1.1.1)
  * oauth (0.5.4)
  * omniauth (1.9.1)
  * omniauth-oauth (1.1.0)
  * omniauth-twitter (1.4.0)
  * padrino (0.15.0)
  * padrino-admin (0.15.0)
  * padrino-cache (0.15.0)
  * padrino-core (0.15.0)
  * padrino-gen (0.15.0)
  * padrino-helpers (0.15.0)
  * padrino-mailer (0.15.0)
  * padrino-support (0.15.0)
  * rack (2.2.2)
  * rack-protection (2.0.8.1)
  * rack-test (1.1.0)
  * rake (13.0.1)
  * rb-fsevent (0.10.4)
  * rb-inotify (0.10.1)
  * rspec (3.9.0)
  * rspec-core (3.9.2)
  * rspec-expectations (3.9.2)
  * rspec-mocks (3.9.1)
  * rspec-support (3.9.3)
  * ruby2_keywords (0.0.2)
  * sass (3.7.4)
  * sass-listen (4.0.0)
  * sinatra (2.0.8.1)
  * sqlite3 (1.4.2)
  * thor (0.20.3)
  * thread_safe (0.3.6)
  * tilt (2.0.10)
  * tzinfo (1.2.7)
  * zeitwerk (2.3.0)
Use `bundle info` to print more detailed information about a gem

référence

Recommended Posts

J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de créer un environnement de développement Spring MVC sur Mac
Créer un environnement de développement Spring Boot avec docker
Créez un environnement Vue3 avec Docker!
J'ai essayé de créer un portefeuille avec AWS, Docker, CircleCI, Laravel [avec lien de référence]
[Première construction d'environnement] J'ai essayé de créer un environnement Rails6 + MySQL8.0 + Docker sur Windows 10.
Créez un environnement de développement pour créer des applications Ruby on Jets + React avec Docker
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
[Rails] J'ai essayé de créer une mini application avec FullCalendar
J'ai essayé de créer un React.js x TypeScript x Material-UI sur un environnement docker
Créer un environnement de développement PureScript avec Docker
Créer un environnement de développement Spring Boot-gradle-mysql avec Docker
Créer un environnement de développement Wordpress 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 http2 avec Eclipse + Tomcat
[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
[Memo] Créez facilement un environnement CentOS 8 avec Docker
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
Créez rapidement un environnement de développement WordPress avec Docker
J'ai essayé de créer une application de clonage LINE
J'ai essayé de casser le bloc avec java (1)
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)
Créer un environnement de développement d'applications Web Java avec Docker pour Mac Part2
J'ai essayé de migrer le portfolio créé sur Vagrant vers l'environnement de développement de Docker
J'ai essayé BIND avec Docker
[Note] Créez un environnement Java à partir de zéro avec docker
Essayez de créer un environnement de développement Java à l'aide de Docker
Créer un environnement de développement Chisel avec Windows10 + WSL2 + VScode + Docker
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
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é de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
Créer un environnement Node.js avec Docker
J'ai essayé de moderniser une application Java EE avec OpenShift.
J'ai essayé d'utiliser Wercker pour créer et publier une image Docker qui lance GlassFish 5
J'ai essayé d'interagir avec Java
Créer un environnement de vérification SolrCloud avec Docker
Comment quitter Docker pour Mac et créer un environnement de développement Docker avec Ubuntu + Vagrant
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
[Azure] J'ai essayé de créer une application Java gratuitement ~ Se connecter avec FTP ~ [Débutant]
Commande Docker pour créer un projet Rails avec un seul coup dans l'environnement sans Ruby
[SAP] Créez un environnement de développement avec NW AS ABAP Developer Edition (1)
J'ai essayé de créer une application cartographique simple dans Android Studio
Comment installer Pry après avoir créé un environnement de développement Rails avec Docker
Construire un environnement PostgreSQL avec Docker (de la configuration à juste avant le développement)
Créer un environnement de développement pour Django + MySQL + nginx avec Docker Compose
Étapes pour créer un environnement de développement Ruby on Rails avec Vagrant
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
Créez rapidement un environnement Web à l'aide de Docker