Das neueste Rails-Tutorial (Stand: 8. August 2020) verwendet Rails 6 und Ich möchte mit Docker eine Entwicklungsumgebung erstellen, die dies unterstützt.
Beim Erstellen einer Entwicklungsumgebung für persönlich entwickelte Apps Ich habe Rails 6 eingeführt, weil ich neue Dinge mag ...
Allerdings ... mit der Einführung von Webpack im JavaScript-Modul-Bundler von Rails 6 Die Einführung und Verwaltung von Tools wie Bootstrap und Fontawesome wird sich nicht nur ändern, sondern auch Erstens sind beim Erstellen der Umgebung Schritte erforderlich, die in Rails 5 nicht erforderlich sind: Wir haben die Wände von Rails 6 und Webpack großartig getroffen ...
Da es sehr viel ist, möchte ich mein Wissen und meine Erfahrung durch diesen Versuch organisieren und etablieren.
Außerdem möchte ich das Rails-Tutorial erneut ausführen und mein Lernen vertiefen.
Persönlich entwickelte App
mdClip
Zuvor ein Artikel zum Erstellen einer Rails 5-Umgebung mit Docker Erstmalige Erstellung einer Rails-Entwicklungsumgebung mit Docker [NGINX + Rails 5 (puma) + PostgreSQL] --Qiita
Bereiten Sie die folgenden 5 Dateien im Arbeitsbereich vor
Dockerfile
, docker-compose.yml
, Gemfile
, Gemfile.lock
, entrypoint.sh
https://github.com/naokit1030/sample_app_on_docker.git
git clone -b create-docker-files https://github.com/dev-naokit/sample_app_on_docker.git
Dockerfile
--Verwenden Sie "alpine", um das Gewicht des Bildes zu reduzieren
--nodejs und Garn sind erforderlich, um Webpack zu installieren
Die Option -j4 von --bundle install beschleunigt die Bundle-Installation
FROM ruby:2.6.3-alpine
ENV LANG=ja_JP.UTF-8
ENV TZ=Asia/Tokyo
ENV ROOT=/myapp \
GEM_HOME=/bundle \
BUNDLE_PATH=$GEM_HOME
ENV BUNDLE_BIN=$BUNDLE_PATH/bin
ENV PATH /app/bin:$BUNDLE_BIN:$PATH
WORKDIR $ROOT
RUN apk update && \
apk upgrade && \
apk add --no-cache \
gcc \
g++ \
libc-dev \
libxml2-dev \
linux-headers \
make \
nodejs \
postgresql \
postgresql-dev \
tzdata \
yarn && \
apk add --virtual build-packs --no-cache \
build-base \
curl-dev
COPY Gemfile $ROOT
COPY Gemfile.lock $ROOT
RUN bundle install -j4
#Löschen Sie nicht benötigte Dateien
RUN rm -rf /usr/local/bundle/cache/* /usr/local/share/.cache/* /var/cache/* /tmp/* && \
apk del build-packs
COPY . $ROOT
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["sh", "/usr/bin/entrypoint.sh"]
EXPOSE 3000
docker-compose.yml
: cahed
wurde zum Volume hinzugefügt, um das Problem des langsamen Speicherzugriffs auf dem Mac zu beheben
--Webpack-dev-server wird in einem anderen Container gestartet, um das Hot-Reload zu unterstützen.
(Wenn sich die Dateistruktur ändert, wird der Browser neu geladen und bei Bedarf um Javascript kompiliert.)
--db Host, Benutzer, Passwort werden später wiederverwendetversion: '3'
services:
db:
image: postgres:11.0-alpine
volumes:
- postgres:/var/lib/postgresql/data:cached
environment:
- TZ=Asia/Tokyo
ports:
- '5432:5432'
environment:
PGDATA: /var/lib/postgresql/data/pgdata
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --locale=ja_JP.UTF-8'
TZ: Asia/Tokyo
app:
build: .
command: ash -c "rm -f tmp/pids/server.pid && ./bin/rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp:cached
- rails_cache:/myapp/tmp/cache
- bundle:/bundle:cached
tmpfs:
- /tmp
tty: true
stdin_open: true
ports:
- "3000:3000"
environment:
RAILS_ENV: development
NODE_ENV: development
DATABASE_HOST: db
DATABASE_PORT: 5432
DATABASE_USER: postgres
DATABASE_PASSWORD: password
WEBPACKER_DEV_SERVER_HOST: webpacker
depends_on:
- db
- webpacker
links:
- db
- webpacker
webpacker:
build: .
command: ./bin/webpack-dev-server
volumes:
- .:/myapp:cached
environment:
RAILS_ENV: development
NODE_ENV: development
WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
tty: false
stdin_open: false
ports:
- '3035:3035'
volumes:
rails_cache:
postgres:
bundle:
Gemfile
source 'https://rubygems.org'
gem 'rails', '6.0.3'
Gemfile.lock
Nur der Befehl touch
ist als leere Datei in Ordnung
touch Gemfile.lock
entrypoint.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
docker-compose run app rails new . --force --no-deps --database=postgresql --skip-bundle
Gemfile
Geändert wie folgt gemäß dem Rails-Tutorial
(Es wurde geändert, um PostgreSQL auch in Entwicklungs- und Testumgebungen zu verwenden.)
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
gem 'rails', '6.0.3'
gem 'puma', '4.3.4'
gem 'pg', '1.1.4'
gem 'sass-rails', '5.1.0'
gem 'webpacker', '4.0.7'
gem 'turbolinks', '5.2.0'
gem 'jbuilder', '2.9.1'
gem 'bootsnap', '1.4.5', require: false
group :development, :test do
gem 'byebug', '11.0.1', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
gem 'web-console', '4.0.1'
gem 'listen', '3.1.5'
gem 'spring', '2.1.0'
gem 'spring-watcher-listen', '2.0.1'
end
group :test do
gem 'capybara', '3.28.0'
gem 'selenium-webdriver', '3.142.4'
gem 'webdrivers', '4.1.2'
gem 'rails-controller-testing', '1.0.4'
gem 'minitest', '5.11.3'
gem 'minitest-reporters', '1.3.8'
gem 'guard', '2.16.2'
gem 'guard-minitest', '2.4.6'
end
group :production do
end
#Tzinfo für Zeitzoneninformationen unter Windows-muss Datenjuwel enthalten
#gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
docker-compose run app bundle update
Für Rails 6 ist ein Webpacker erforderlich. Es ist nicht so installiert wie es ist, also installieren Sie es
docker-compose run app rails webpacker:install
config/database.yml
Ordnen Sie Host, Benutzername und Passwort "docker-compose.yml" zu
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: password
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
#Kürzung...
docker-compose build
'Build' ist jedes Mal erforderlich, wenn Sie eine Docker- oder Gem-Datei ändern
Es wird einige Zeit dauern, da auch die Bundle-Installation durchgeführt wird.
docker-compose build
docker-compose up
Es wird gesagt, dass es keine Datenbank gibt, wie sie ist. Erstellen Sie daher eine Datenbank für die Entwicklungsumgebung
docker-compose run app rake db:create
Überprüfen Sie den Container, der mit "Docker ps" ausgeführt wird Es werden drei Container ausgeführt: DB, Rails und Webpack-Dev-Server.
$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
1fb4f53d5652 sample_app_on_docker_app "sh /usr/bin/entrypo…" ... 0.0.0.0:3000->3000/tcp sample_app_on_docker_app_1
ccd40c018d53 sample_app_on_docker_webpacker "sh /usr/bin/entrypo…" ... 3000/tcp, 0.0.0.0:3035->3035/tcp sample_app_on_docker_webpacker_1
74392532098a postgres:11.0-alpine "docker-entrypoint.s…" ... 0.0.0.0:5432->5432/tcp sample_app_on_docker_db_1
Wenn Sie mit einem Browser auf localhost: 3000
zugreifen
Vielen Dank für Ihre harte Arbeit "Yay! Sie sind auf Schienen!"
Trouble shoot
check_yarn_integrity
bezogenFehler beim Starten eines Containers mit "Docker-Compose Up"
app_1 | ========================================
app_1 | Your Yarn packages are out of date!
app_1 | Please run `yarn install --check-files` to update.
app_1 | ========================================
app_1 |
app_1 |
app_1 | To disable this check, please change `check_yarn_integrity`
app_1 | to `false` in your webpacker config file (config/webpacker.yml).
app_1 |
app_1 |
app_1 | yarn check v1.16.0
app_1 | info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.
app_1 |
app_1 |
app_1 | Exiting
sample_app_on_docker_app_1 exited with code 1
config/webpacker.yml
Ändern Sie wie folgt
#...Kürzung
development:
<<: *default
compile: false # true ->Wechseln Sie zu false
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: true
#Kürzung...
"webpack-dev-server" not found
Ebenso ein Fehler, der beim Starten eines Containers mit "Docker-Compose Up" auftritt
webpacker_1 | yarn run v1.16.0
webpacker_1 | error Command "webpack-dev-server" not found.
webpacker_1 | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
sample_app_on_docker_webpacker_1 exited with code 1
Weil webpack-dev-server nicht in "package.json" beschrieben werden sollte Installieren Sie den Webpack-Dev-Server
docker-compose run app yarn add webpack-dev-server
Bildgröße 477 MB Ich beabsichtige, viel Weisheit meiner Vorfahren auszuleihen, um das Gewicht zu reduzieren. Als ich anfing, Docker zu lernen, war das Bild, das ich gemacht habe, ungefähr 1,5 GB ...
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sample_app_on_docker_app latest 84aed607a3d2 31 minutes ago 477MB
sample_app_on_docker_webpacker latest 84aed607a3d2 31 minutes ago 477MB