Previous article
I explained the introduction of Docker on EC2.
This time, I will continue to explain ** how to start Docker container on EC2 using Docker and docker-compose on EC2, how to manually deploy Rails application and start the server **, etc. I will.
(1) Docker and docker-compose must be installed in the development environment
(2) Docker and docker-compose must be installed in the initial settings (environment settings) of EC2.
Ruby 2.6.5 Bundler 2.1.4 Rails 6.0.0 MySQL 5.6.50 AWS EC2
Up to the last time, you have been able to create a DB in Docker on EC2, so all you have to do is start it and deploy it.
However, I was frustrated because I couldn't start it for about 8 hours because I had a hard time starting it here (laughs).
Is #unicorn required?
In my case, I thought that unicorn
was indispensable for EC2 deployment, and I saw some articles that could start the server with Docker and unicorn, so I thought that I could go with it.
However, I fell in love with the swamp there. Since the DB was created normally, execute the following in the terminal.
Terminal(EC2)
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
I started the server with this command.
Then I got the following error.
Terminal(EC2)
ArgumentError: directory for
pid=/var/www/app/tmp/pids/unicorn.pid not writable
At first, I thought it was a permission problem, and I thought that the app/tmp/pid
directory did not exist, so I tried and errored by referring to the following article.
I worked by referring to the following article.
① Unicorn error (unicorn.pid not writable (ArgumentError)) ② [Capistrano, Unicorn] ArgumentError: directory for pid =/var/www/myapp/current/shared/tmp/pids/unicorn.pid not writable was not a write permission issue ③ Unicorn cannot be started with unicorn.pid not writable (ArgumentError)
However, none of them went well and I started out ...
If so, I was thinking that there was another cause ... "** I started the container in the first place, so I don't have to bother to start the server with unicorn? **" and started the container.
Terminal(EC2)
#Container creation
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker-compose build
#Create DB in container
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker-compose run web rails db:create RAILS_ENV=production
#Perform migration in container
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker-compose run web rails db:migrate RAILS_ENV=production
#Start container
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker-compose up -d
# -Can be started in the background by adding the d option
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker ps -a
#Check if status is up
Now I should be deploying ... and when I access http: // Elastic IP: 3000 /
, I get angry that there is no database_development
.
I don't know if it's special for me, but I thought it was OK because I created a DB for the production environment with RAILS_ENV = production
, but I got an error when I included the one in the development environment, so enter the following did.
Terminal(EC2)
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker-compose run web rails db:create
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker-compose run web rails db:migrate
The editor also changed the description a little.
docker-compose.yml(Change before)
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'password'
ports:
- "4306:3306" #Settings required for connecting to Docker container and Sequelpro
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
#Change the volume part
volumes:
- .:/app name
ports:
- "3000:3000"
depends_on:
- db
docker-compose.yml(After change)
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'password'
ports:
- "4306:3306" #Settings required for connecting to Docker container and Sequelpro
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
#Change volumes from app name
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3000:3000"
depends_on:
- db
Now when I save, update, and view it in my browser, I get another error.
Webpacker::Manifest::MissingEntryError
I thought, "Oh, the error has changed!" And tried to solve it, but this was difficult.
The error is "** Browser cannot read JavaScript etc. **".
For that purpose, what to do is to do ** asset compilation ** if the browser can read it, but I needed a little confirmation, and I was addicted to it.
If you come up with rails s
etc., please refer to the following article.
This article introduces ** How to resolve errors around Webpacker **.
[Rails6] 4 ways to deal with Webpacker :: Manifest :: MissingEntryError
So, ** execute asset compilation **
Terminal(EC2)
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker-compose run web rails assets:precompile RAILS_ENV=production
Compile the assets inside the container and start the container.
Terminal(EC2)
[ec2-user@ip-XXX-XX-XX-XXX repository name]$ docker-compose up
** If you can access http: // Elastic IP: 3000/** It's a success.
Automatic deployment with Docker + Rails5.2 + Unicorn + Nginx + capistrano
Webpacker, yarn related errors and solutions that may stumble during Rails6 development
[Rails 6] What to do when Webpacker :: Manifest :: MissingEntryError occurs
Recommended Posts