Ich habe versucht, eine Rails6- und Docker-Umgebung zu erstellen, daher werde ich sie hier als Memorandum belassen. Qiita Dies ist mein erster Beitrag, und da ich Anfänger bin, denke ich, dass es verschiedene Punkte gibt, die nicht erreicht werden können. Ich würde mich freuen, wenn Sie auf Fehler hinweisen könnten.
Umgebung
Referenz Erstellen Sie eine Rails6 + MySQL-Umgebung mit Docker-Compose [Rails-Umgebungskonstruktion] Umgebungskonstruktion mit Docker + Rails + MySQL (auch Anfänger können in 30 Minuten fertig sein!) [ENTRYPOINT ist "immer ausführen", CMD ist "(Standard-) Argument"](https://pocketstudio.net/2020/01 / 31 / cmd-and-entrypoint /)
Es wurde in Bezug darauf durchgeführt.
Erstellen Sie die Umgebung und zeigen Sie den Rails-Startbildschirm an.
https://hub.docker.com/ Gehen Sie zu und installieren Sie.
$ mkdir ~/Desktop/docker-tutrial/Rails_app
$ cd ~/Desktop/docker-tutrial/Rails_app
$ code Dockerfile
Öffnen Sie ein Terminal, erstellen Sie ein Verzeichnis an einem beliebigen Ort und schreiben Sie `` `Dockerfile``` wie folgt. (Ich benutze vsCode.)
$Name der Codedatei
Dann startet vsCode und Sie können eine neue Datei schreiben. (VsCode muss vorab auf Ihrem PC installiert sein.)
FROM ruby:2.7
RUN apt-get update -qq && apt-get install -y nodejs yarnpkg
RUN ln -s /usr/bin/yarnpkg /usr/bin/yarn
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
source 'https://rubygems.org'
gem 'rails', '~>6'
$ touch Gemfile.lock
Schreiben Sie das erste `Gemfile
und das leere
`` Gemfile.lock```.
Einstiegspunkt als ENTRYPOINT in Dockerfile definiert.Beschreibe sh.
```shell
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /app/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
version: '3'
services:
db:
image: mysql:8.0
volumes:
- ./tmp/db:/var/lib/mysql
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=1
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- db
MySQL verwendet Version 8.0
Durch Festlegen von ** MYSQL_ALLOW_EMPTY_PASSWORD ** können Sie eine Verbindung als root herstellen, auch wenn das Kennwort leer ist.
$ docker-compose run web bundle exec rails new . --force --database=mysql
Überschreiben Sie die vorhandene Datei mit ** --force ** und geben Sie MySQL mit ** --database ** an. Nachdem Sie die übliche Rails-Dateigruppe haben, erstellen Sie sie.
$ docker-compose build
Da Sie keine Verbindung zur Datenbank herstellen können, Ersetzen Sie ** host ** in ** config / database.yml ** durch ** db **.
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
host: db
development:
<<: *default
database: app_development
test:
<<: *default
database: app_test
** db ** ist der Containername.
Sobald dies erledigt ist, bauen Sie erneut und machen Sie ** Docker-Compose Up **. Wenn Sie mit ** localhost: 3000 ** auf Rails zugreifen, erhalten Sie ** ActiveRecord :: NoDatabaseError **.
Dies liegt daran, dass der Webcontainer die Authentifizierungsmethode ** caching_sha2_password ** von mysql 8.0 nicht unterstützt. Führen Sie die folgenden Schritte aus, um zur alten Authentifizierungsmethode ** mysql_native_password ** zu wechseln.
Geben Sie zunächst den DB-Container ein und starten Sie bash.
$ docker-compose exec db bash
Stellen Sie dann eine Verbindung mit dem Befehl mysql her.
# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.18 MySQL Community Server - GPL
...
Sie können die Benutzerliste und ihre Authentifizierungsmethode anzeigen, indem Sie die folgende Abfrage senden.
mysql> select User,Host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| User | Host | plugin |
+------------------+-----------+-----------------------+
| root | % | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
Ändern Sie ** caching_sha2_password ** im Plugin ganz rechts in ** mysql_native_password **. Verwenden Sie ** ALTER USER **, um diesmal die Benutzereinstellungen für das Ziel ** root @% ** zu ändern.
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '';
-- Query OK, 0 rows affected (0.02 sec)
Nach der veränderung
mysql> select User,Host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| User | Host | plugin |
+------------------+-----------+-----------------------+
| root | % | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
Wenn Sie ** db: vorbereiten ** und eine Datenbank erstellen, können Sie auf den Rails-Startbildschirm zugreifen.