Docker의 Rails를 heroku에 배포

heroku에 배치된 연습


Dcoker 컨테이너에 Rails 응용 프로그램을 조립하고 Circleci를 사용하여 한 번에 자동 배포하려면
미궁에 빠졌기 때문에 원점으로 돌아가고 싶어요.(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
개발 환경은 MySQL
나는 PostgreSQL 모델로 생산 환경을 조립해 보고 싶다.

Docker에서 Rails 어플리케이션 준비


우선 프로그램을 만드는 디렉터리를 만들고 터치 명령으로 필요한 여러 가지를 준비한다.
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 "$@"
위의 다섯 가지를 준비할 수 있다면 다음 명령을 실행하여 Rails 응용 프로그램을 만듭니다.
terminal
$docker-compose run web rails new . --force --no-deps --database=mysql
동시에 용설란주 내용을 잘 만들어라.
$ docker-compose run web rails g scaffold blog title:string body:text
$ docker-compose run web rails db:migrate
$ docker-compose up -d

heroku에 배치 준비


다음은 Heroku에 Rails 응용 프로그램을 배치하기 전에 생산 환경을 위한 PostgreSQL을 준비합니다.
- config/database.yml 설정
- Gemfile에 pg 추가
- config/enviroments/deviropment.rb 설정

config/database.yml 설정


config/database.yml
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5

Gemfile 설정


생산 환경을 위한gem 파일을 준비하다.
제품 그룹에 pg를 추가합니다.
또한 MySQL을 개발 환경으로 사용하기 위해 group :development, :test do 로 이동합니다.
Gemfile
group :production do
  gem 'pg', '~> 0.19.0'
end

config/enviroments/deviropment.rb 설정


Rails6 특유의 것이지만 DNS의 바인딩 공격 이탈을 방지하는 보호 기능이 있는 것 같습니다.
나는 너에게 호스트를 하나 추가해야 한다.
config/enviroments/deviropment.rb
config.hosts << "radiant-springs-45017.herokuapp.com"
아래의 보도를 참고하도록 허락해 주십시오.
https://qiita.com/kodai_0122/items/67c6d390f18698950440
편집이 완료되면 구축됩니다.
terminal
docker-compose build
$docker-compose run web rails db:create
$docker-compose up -d
그리고 론과 헤로쿠에 배치하라는 명령을 내린다.
$ docker-compose down #一度落としておかないとエラーになる可能性があるとのこと
$ heroku login
$ heroku create アプリ名もしくは空欄
$ heroku container:login
$ heroku container:push web
$ heroku adding:create heroku-postgresql:hobby-dev
$ heroku container:release web
$ heroku open

끝났어!
사랑을 끊었지만 heroku에 배치하는 중 오류가 발생했습니다.
그때 종착역에서 $ heroku logs --tail 등을 쳐서 조사 착오가 해결되었다.
성공한 기사를 참고해도 환경에 따라 오류가 발생하기 때문에 매번 조사하는 습관을 기르는 것이 중요하다.

좋은 웹페이지 즐겨찾기