In diesem Artikel werde ich vorstellen, wie Sie mit Docker eine Entwicklungsumgebung für Ruby on Rails (im Folgenden: Rails) der 5.x-Serie erstellen.
Die meisten Anfänger von Rails installieren es normalerweise direkt auf ihrem Computer, um eine Entwicklungsumgebung zu erstellen. Wenn Sie jedoch aufgrund einer subtilen Umgebung (z. B. Ruby-Version oder Umgebungsvariablen) stolpern, Ich denke, es wird viel Zeit in Anspruch nehmen, um das Problem zu beheben.
Erstellen Sie daher mit Docker eine Rails-Umgebung in der virtuellen Umgebung Gleiches Verhalten kann in jeder Entwicklungsumgebung auf jedem Computer erreicht werden, wodurch Fehler aufgrund unterschiedlicher Umgebungen vermieden werden. Es ist auch ein Vorteil, dass Sie im schlimmsten Fall einmal zurücksetzen können, wenn Sie zu viel mit der Umgebung zu tun haben.
Wenn Sie versuchen, die erstellte Anwendung als Produktionsumgebung nach außen zu veröffentlichen Sie können es als stabile Anwendung ausführen, indem Sie den Unterschied zwischen der Entwicklungsumgebung und der Produktionsumgebung minimieren. Möglicherweise ist es schwierig, mit Docker eine virtuelle Umgebung zu erstellen und zu veröffentlichen. In letzter Zeit verfügen sogar Cloud-Dienste wie AWS über Dienste wie ECS, die Docker-Container so ausführen können, wie sie sind. Es wird auch einfacher, die mit Docker erstellte Umgebung zu veröffentlichen.
Docker auf Ihrem Computer installiert
Wenn Sie Docker nicht installiert haben, laden Sie das Docker-Installationsprogramm von der offiziellen Website herunter und installieren Sie es. → Docker Official
Erstellen Sie außerdem einen beliebigen Arbeitsordner. Hier erstellen wir einen Ordner namens "Rails-Docker" und arbeiten daran.
$ mkdir rails-docker
$ cd rails-docker
Bereiten Sie die folgenden vier leeren Dateien in Rails-Docker vor. Wenn Sie VScode verwenden, können Sie ihn erstellen, indem Sie eine neue Datei erstellen. Sie können auch den Touch-Befehl vom Mac-Terminal aus verwenden.
.
├── Dockerfile #Erstelle neu
├── Gemfile #Erstelle neu
├── Gemfile.lock #Erstelle neu
└── docker-compose.yml #Erstelle neu
Docker erstellt den Container basierend auf einer Datei namens Dockerfile. Ein Docker-Image (Vorlage des Containers) wird erstellt.
Schreiben Sie zunächst den vollständigen Text der Docker-Datei. Die verwendete Version von Ruby ist 2.7.0.
FROM ruby:2.7.0
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
Obwohl es sich um ein Bulletin handelt, werde ich die Bedeutung jedes einzelnen erläutern.
In Ruby können Sie den Edelstein, den Sie in Ihrer Umgebung verwenden möchten, mit einer Datei namens Gemfile definieren.
Ein Juwel ist eine Ruby-Bibliothek. Das Gem wird von einem Paketverwaltungssystem für Ruby namens RubyGems verwaltet und kann über den von RubyGems bereitgestellten gem-Befehl installiert werden.
source 'https://rubygems.org'
gem 'rails', '5.2.1'
Ich werde es noch einmal erklären.
Wenn ich den Befehl "bundle install" in dem Verzeichnis ausführe, in dem sich die Gemfile befindet, Sie können den definierten Edelstein gemäß der Definition in der Gemfile installieren.
Kopieren Sie für die zuvor erwähnte Docker-Datei die Gem-Datei in das Arbeitsverzeichnis des Containers. Sie haben angegeben, dass die Bundle-Installation in diesem Ordner ausgeführt werden soll.
Tatsächlich muss Gemfile.lock zunächst nichts schreiben. Dies ist keine Datei, die Sie direkt bearbeiten Nach dem Ausführen der Bundle-Installation basierend auf Gemfile Die installierten Edelsteine werden nun in Gemfile.lock aufgelistet.
Informationen zur Verwendung finden Sie in Gemfile.lock, um den installierten Edelstein und die installierte Version zu finden. Sie können die Bundle-Installation auch über Gemfile.lock ausführen Gemfile.lock wird verwendet, wenn Sie genau dieselbe Umgebung neu erstellen möchten oder wenn Sie mit einer großen Anzahl von Personen entwickeln.
Ist es nicht nur eine Gemfile? Als Ergänzung zu denen, die es für scharf hielten, ist einer der Gründe, dass Gemfile tatsächlich so geschrieben werden kann.
gem 'rails', '~> 5.2.1'
In diesem Fall ist die Version der durch Bundle-Installation installierten Schienen 5.2.1 oder höher Die tatsächliche Version, die installiert (veröffentlicht) werden kann, hängt von der Zeit ab.
In Gemfile.lock sind jedoch das Gem selbst und die spezifische Version, die tatsächlich installiert wurde, als versucht wurde, gemäß Gemfile zu installieren, Es werden sogar die Pakete aufgezeichnet, die für zufällige Anforderungen installiert wurden.
Kurz zusammengefasst ist Gemfile eine "Liste der von der App benötigten Edelsteine". Auf der anderen Seite enthält Gemfile.lock "Informationen zu dem Gem, das tatsächlich installiert wurde, weil Sie dem Gemfile gefolgt sind".
Diese yml-Datei wird von Docker Compose verwendet.
Docker Compose ist für Anwendungen gedacht, die aus mehreren Containern bestehen Es ist ein Tool zum Verwalten, z. B. zum Erstellen eines Docker-Images und zum Starten / Stoppen jedes Containers.
In Docker Compose werden die Definitionen für mehrere Container, einschließlich Optionen für den Docker-Build und den Container-Start, in einer Datei mit dem Namen docker-compose.yml beschrieben. Sie können damit ein Docker-Image erstellen oder einen Container starten.
Wenn Sie Rails wie eine Entwicklungsumgebung selbst ausführen möchten, können Sie einfach Dockerfile verwenden. Neben dem Anwendungsserver zum Ausführen von Rails Ein Webserver zum Akzeptieren des Zugriffs aus dem Internet beim tatsächlichen Veröffentlichen. Möglicherweise bereiten wir auch einen Datenbankserver zum Speichern und Verarbeiten von Daten vor.
docker-compose.yml
version: '3'
services:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- 3000:3000
depends_on:
- db
tty: true
stdin_open: true
db:
image: mysql:5.7
volumes:
- db-volume:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
db-volume:
Da für Rails auch eine Datenbank erforderlich ist, erstellen wir einen Container für den Datenbankserver, der sowohl MySQL als auch den Webserver verwendet. Obwohl hier nicht im Detail erläutert, wird der Datenbankserver (Container), mit dem Rails verknüpft ist, in der Liste "web" in "abhängige_on" namentlich angegeben.
Führen Sie den folgenden Docker-Compose-Befehl in dem Ordner (Rails-Docker-Ordner) aus, in dem sich Docker-Compose.yml befindet.
$ docker-compose run web rails new . --force --database=mysql
Ich werde erklären, wie man den Befehl liest, einschließlich der Optionen ↓
--docker-compose: Mit einem Tool namens docker-compose --run: Führen Sie den folgenden Befehl aus --web: in einem Webcontainer --rails new: Erstellen Sie ein neues Projekt mit Schienen -.: Für das aktuelle Verzeichnis ---- force: Überschreibt vorhandene Dateien (hier Gemfile, Gemfile.lock) ---- database = mysql: MySQL wird jedoch für die Rails-Datenbank verwendet.
Es hat die Bedeutung.
Wenn Sie diesen einzeiligen Befehl ausführen, dauert die Verarbeitung einige Minuten. Warten Sie also geduldig, während Sie Schokolade essen.
Installation von Gem zu Gemfile hinzugefügt, Führen Sie build aus, um die erstellte Datei in den Container zu bringen.
$ docker-compose build
Bearbeiten Sie nach Abschluss des Builds die Einstellungen in der von Rails verwendeten Datenbankdatei. Die Zieldatei ist ** database.yml ** im Konfigurationsverzeichnis.
config/database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password #hinzufügen
host: db #Veränderung
Das Passwort muss mit dem in docker-compose.yml angegebenen Passwort übereinstimmen.
docker-compose.yml
...
environment:
MYSQL_ROOT_PASSWORD: password #Spiel hier
...
Außerdem legt das Hostfeld den Namen des MySQL-Containers fest.
Führen Sie den folgenden Befehl aus, um den Container zu starten:
$ docker-compose up -d
docker-compose up ist ein Befehl zum Starten eines Containers basierend auf docker-compose.yml Es kann im Hintergrund mit der Option "-d" gestartet werden.
Im Moment wurde der Container gerade gestartet und die Datenbank wurde nicht erstellt. Führen Sie den folgenden Befehl aus, um die Datenbank zu erstellen.
$ docker-compose run web bundle exec rails db:create
Es ist ein Prozess zum Ausführen von Rails db: create (= Erstellen einer neuen Datenbank) im Webcontainer, in dem Rails ausgeführt werden.
Sie haben den Rails-Entwicklungsserver erfolgreich gestartet. Geben Sie ** localhost: 3000 ** in die Adressleiste Ihres Browsers ein und überprüfen Sie den Start.
Mit Schienen sind Sie fertig, wenn Sie den bekannten Bildschirm sehen.
Führen Sie den folgenden Befehl aus, um den Entwicklungsserver in einem Stapel zu stoppen.
$ docker-compose down
Wenn Sie es erneut starten möchten, führen Sie docker-comopose up -d aus.
Die dadurch erstellten Dateien sind in Github aufgeführt. Wenn Sie die Ordnerstruktur nicht verstehen oder vergleichen möchten, ob sie in Ihrer Umgebung funktioniert, lesen Sie sie bitte.