Le site officiel Docker a un tutoriel de composition Docker pour les applications Rails (https://docs.docker.com/compose/rails/), mais il est un peu vieux et ne fonctionnait pas bien avec Rails 6, donc Rails 6 Voici comment le déplacer avec. Puisque les bases suivent la procédure du tutoriel officiel, les suppléments sont principalement ajoutés aux modifications apportées pour Rails 6.
DB décrit comment utiliser MySQL au lieu de Postgres.
mkdir myrailsapp
cd myrailsapp
Dockerfile
FROM ruby:2.5
##nodejs et yarn sont requis lors de l'installation de webpack
#Installer l'outil de gestion des packages de fils
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn
RUN apt-get update -qq && apt-get install -y nodejs yarn
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
RUN yarn install --check-files
RUN bundle exec rails webpacker:compile
# 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"]
Rails 6 nécessite du fil pour exécuter Webpacker, alors ajoutez la procédure d'installation de fil au Dockerfile. Si vous installez normalement avec apt-get yarn
avec l'image de ruby: 2.5
, une version étrange de 0.32 + git
sera installée et une erreur se produira plus tard, j'ai donc ajouté le référentiel selon les instructions sur le site officiel de yarn. Plus tard, apt-get install yarn
.
Référence: https://qiita.com/shunichi_com/items/4dca141d8b9342c51a04
De plus, dans l'environnement de production, il est nécessaire de compiler Webpacker à l'avance, j'ai donc ajouté la mise à jour du package de fil et webpacker: compile
.
Exclus car postgres n'est pas utilisé.
Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6'
Spécifiez la série Rails 6 dans Gemfile. Ce Gemfile sera écrasé par le contenu du projet Rails après la création du projet Rails.
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 "$@"
Cette zone est toujours un échantillon officiel, donc l'explication est omise.
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: root
ports:
- "3306:3306"
volumes:
- ./tmp/db:/var/lib/mysql
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
Modifiez le paramètre pour utiliser MySQL.
docker-compose run web rails new . --force --no-deps --database=mysql
Créez un projet avec le paramètre DB défini sur MySQL avec --database = mysql
.
docker-compose build
database.yml
development:
<<: *default
database: myapp_development
host: db
username: root
password: password
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: myapp_test
host: db
username: root
password: password
Décrit le paramètre pour que development
et test
utilisent l'image MySQL db
démarrée par docker-compose.
docker-compose run web rails db:create
docker-compose run web rails webpacker:install
Cette étape est nécessaire car Webpacker est utilisé à la place de Sprockets from Rails 6.
docker-compose up
Scaffold
docker-compose run web rails g scaffold article title:string body:text published_at:timestamp
docker-compose run web rails db:migrate
Lors du développement à l'aide de docker-compose, exécutez les commandes de génération, y compris l'échafaudage et la migration avec docker-compose run web
.
docker-compose up
Recommended Posts