EC2 ✕ Docker 및 docker-compose를 사용한 수동 배포 자산 컴파일

소개



마지막 기사

EC2에서 Docker 환경 구축(ArgumentError: Missing 'secret_key_base', Mysql2::Error::ConnectionError: Access denied for user 'root'@'172.18.0.4'

에서 EC2에서 Docker 도입에 대해 설명했습니다.

이번에는 그 다음으로 EC2에서 Docker와 docker-compose를 이용한 EC2상에서 Docker 컨테이너 시작과 Rails 앱을 수동 배포하고 서버를 시작하는 방법과 오류 해결 등을 설명합니다.

전제



① 개발 환경에서 Docker 및 docker-compose를 도입하고 있는 것

② EC2의 초기 설정(환경 설정)에서 Docker와 docker-compose를 설치하고 있는 것

개발 환경



Ruby 2.6.5
번들러 2.1.4
Rails 6.0.0
MySQL 5.6.50
AWS EC2

EC2에서 Rails 앱 시작



마지막으로 EC2에서 Docker에 DB를 만들 수 있기 때문에 나중에 시작하고 배포하기 만하면됩니다.

다만, 여기의 기동으로 자신은 상당히 손잡이 8시간 정도 기동할 수 없고 괴로웠습니다(웃음)

# unicorn은 필수입니까?

자신의 경우 EC2의 배포에서는 unicorn가 필수라고 생각하고 있었고, Docker와 unicorn에서 서버를 시작할 수 있는 기사도 살펴보았으므로, 그걸로 갈 수 있다고 생각했습니다.

단지, 거기서 늪에 빠졌습니다.
보통 DB가 생겼기 때문에 터미널에서 다음을 실행.

터미널(EC2)
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

이 명령으로 서버를 시작했습니다.

그러면 다음과 같은 오류가 발생했습니다.

터미널(EC2)
ArgumentError: directory for
pid=/var/www/app/tmp/pids/unicorn.pid not writable

처음은 권한의 문제일까라고 생각하거나, app/tmp/pid 의 디렉토리가 없는 것이라고 생각 이하 기사를 참고로 시행착오했습니다.
아래의 기사를 참고로 작업했습니다.

Unicorn 오류(unicorn.pid not writable (ArgumentError))
【Capistrano,Unicorn】ArgumentError: directory for pid=/var/www/myapp/current/shared/tmp/pids/unicorn.pid not writable가 쓰기 권한의 문제가 아니었다
unicorn.pid not writable (ArgumentError)로 Unicorn을 시작할 수 없습니다.

하지만, 아무것도 잘 가지 않고 내보내기 ...

그렇다면 그 밖에 원인은...이라고 생각하고 있으면, "원래 컨테이너 기동하기 때문에, 일부러 unicorn로 서버 기동하지 않아도 되는 것은?"라고 생각해, 컨테이너를 기동.

터미널(EC2)
# コンテナ作成
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker-compose build
# コンテナ内にDB作成
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker-compose run web rails db:create RAILS_ENV=production
# コンテナ内でマイグレーションの実行
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker-compose run web rails db:migrate RAILS_ENV=production
# コンテナを起動
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker-compose up -d
# -dオプションを付けることでバックグラウンドで起動できる
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker ps -a
# statusがupになっているか確認

이제 배포가 아니라 ...와 http://Elastic IP:3000/에 액세스하면 database_development가 없다고 화가났습니다.

database_development 만들기



자신의 경우는 특수한 것인지는 모릅니다만, RAILS_ENV=production 로 프로덕션 환경의 DB를 작성했기 때문에 OK라고 생각했고, 개발 환경의 물건도 들어가면 에러가 나왔으므로, 이하를 입력했습니다.

터미널(EC2)
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker-compose run web rails db:create 
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker-compose run web rails db:migrate

편집자도 설명을 조금 바꿨습니다.

docker-compose.yml (변경 전)
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'password' 
    ports:
      - "4306:3306" #DockerコンテナとSequelpro接続の為に必要な設定

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
# volumes の部分を変更
    volumes:
      - .:/アプリ名
    ports:
      - "3000:3000"
    depends_on:
      - db

docker-compose.yml (변경 후)
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'password' 
    ports:
      - "4306:3306" #DockerコンテナとSequelpro接続の為に必要な設定

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
# volumes をアプリ名から変更
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3000:3000"
    depends_on:
      - db

이제 저장, 업데이트 및 브라우저를 보면 이번에는 또 다른 오류가 발생했습니다.



Webpacker::Manifest::MissingEntryError



「오, 에러가 바뀌었다!」라고 생각해, 해결에 임하지만, 이것이 꽤 어려웠다.

어떤 에러인가 하면 "브라우저가 JavaScript 등을 로드하지 않는다"라는 에러입니다.

그 때문에, 무엇을 하는가 하면(자), 브라우저가 읽어들일 수 있도록(듯이) 하면 자산 컴파일을 실시하면 됩니다만, 약간의 확인등이 필요해,,, 거기에 빠졌습니다.
rails s 등으로 나온 경우는 아래의 기사를 참고해 보세요.
이 기사에서는 Webpacker 주변의 오류 해결 방법을 소개합니다.

[Rails6]Webpacker::Manifest::MissingEntryError의 대처법 4선

그래서 자산 컴파일을 실행합니다.

Docker 컨테이너에서 자산 컴파일 실행



터미널(EC2)
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker-compose run web rails assets:precompile RAILS_ENV=production

컨테이너 내에서도 자산을 컴파일하고 컨테이너를 시작합니다.

터미널(EC2)
[ec2-user@ip-XXX-XX-XX-XXX リポジトリ名]$ docker-compose up

http://Elastic IP:3000/에 액세스 할 수 있으면
성공입니다.

참고문헌



Docker + Rails5.2 + Unicorn + Nginx + capistrano로 자동 배포

Rails6 개발시 어지러운 webpacker, yarn 관련 오류 및 해결 방법

【Rails6】Webpacker::Manifest::MissingEntryError가 나왔을 때의 대처법

좋은 웹페이지 즐겨찾기