Wenn Sie eine Rails-App auf einem Dcoker-Container erstellen und Circleci verwenden, um die automatische Bereitstellung sofort durchzuführen Nachdem ich das Labyrinth betreten habe, werde ich zum Ursprung zurückkehren. (2.)
Ruby : 2.6.6 rails : 6.0.3.2 git : 2.23.0 heroku-cli : 7.42.13 darwin-x64 node-v12.16.2 Docker : 19.03.12
Entwicklungsumgebung ist MySQL Ich werde versuchen, eine Produktionsumgebung mit einem Muster namens PostgreSQL zu erstellen.
Erstellen Sie zunächst ein Verzeichnis zum Erstellen der Anwendung und bereiten Sie die erforderlichen Elemente mit dem dortigen Befehl touch vor.
terminal
$ touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh}
Dockerfile
FROM ruby:2.6
RUN 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 -qq \
&& apt-get install -y nodejs yarn \
&& mkdir /heroku_app
WORKDIR /heroku_app
COPY Gemfile //Gemfile
COPY Gemfile.lock /heroku_app/Gemfile.lock
RUN bundle install
COPY . /heroku_app
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3006
CMD ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
version: '3'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- '3306:3306'
command: --default-authentication-plugin=mysql_native_password
volumes:
- mysql-data:/var/lib/mysql:cached
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3006 -b '0.0.0.0'"
volumes:
- .:/heroku_app
ports:
- "3006:3000"
depends_on:
- db
stdin_open: true
tty: true
command: bundle exec rails server -b 0.0.0.0
volumes:
mysql-data:
driver: local
Gemfile
source 'https://rubygems.org'
rails ‘6.0.3’
entrypoint.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /heroku_app/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
Wenn Sie die obigen 5 Punkte vorbereiten können, führen Sie den folgenden Befehl aus, um eine Rails-Anwendung zu erstellen.
terminal
$docker-compose run web rails new . --force --no-deps --database=mysql
Erstellen Sie gleichzeitig einen Textinhalt.
$ docker-compose run web rails g scaffold blog title:string body:text
$ docker-compose run web rails db:migrate
$ docker-compose up -d
Bereiten Sie anschließend postgreSQL für die Produktion vor, bevor Sie die Rails-App für heroku bereitstellen.
config/database.yml
production:
<<: *default
adapter: postgresql
encoding: unicode
pool: 5
Bereiten Sie eine Gem-Datei für die Produktionsumgebung vor.
Fügen Sie der Produktionsgruppe pg hinzu.
Verschieben Sie MySQL außerdem in `group: development ,: test do
`, damit es als Entwicklungsumgebung behandelt wird.
Gemfile
group :production do
gem 'pg', '~> 0.19.0'
end
Es ist einzigartig für Rails6, scheint jedoch vor DNS-Ablösungsbindungsangriffen geschützt zu sein. Sie müssen den Host eingeben.
config/enviroments/deviropment.rb
config.hosts << "radiant-springs-45017.herokuapp.com"
Ich habe auf den folgenden Artikel verwiesen. https://qiita.com/kodai_0122/items/67c6d390f18698950440
Nach dem Bearbeiten erstellen.
terminal
docker-compose build
$docker-compose run web rails db:create
$docker-compose up -d
Geben Sie danach einen Befehl ein und stellen Sie ihn für Runrun und Heroku bereit.
$ docker-compose down #Wenn Sie es nicht einmal löschen, kann ein Fehler auftreten
$ heroku login
$Heroku erstellen App-Namen oder leer
$ heroku container:login
$ heroku container:push web
$ heroku adding:create heroku-postgresql:hobby-dev
$ heroku container:release web
$ heroku open
das Ende!
Ich habe es weggelassen, aber beim Bereitstellen auf Heroku ist ein Fehler aufgetreten. In diesem Fall habe ich "` $ heroku logs --tail`` "usw. auf dem Terminal eingegeben, um den Fehler zu überprüfen und zu beheben. Selbst wenn Sie sich auf einen erfolgreichen Artikel beziehen, kann aufgrund von Unterschieden in der Umgebung ein Fehler auftreten. Daher hielt ich es für wichtig, sich daran zu gewöhnen, jedes Mal nach dem Verständnis zu suchen.