docker-compose.yml과
rails앱 프로젝트 루트의 config/database.yml에서 설정해야한다.
MySQL에 따로 사용자를 생성하지 않고, root 계정으로 접속하도록 했다.
version: "3.9"
services:
web:
build: .
command: bundle exec rails s -p 3000 -e development -b '0.0.0.0'
ports:
- 3001:3000
volumes:
- .:/usr/src/app
depends_on:
- database
- redis
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=basic
- MYSQL_USERNAME=root
- MYSQL_HOST=db
redis:
image: redis
db:
image: mysql:5.7
restart: always
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=basic
ports:
- 3307:3306
volumes:
- db:/var/run/mysqld
volumes:
db:
mysql서버와 연결하기 위해서 필요한 소켓파일을 위치를 지정해줘야한다.
mysql에서 소켓 파일 위치를 못찾으면 다음과 같은 에러를 띄운다. 가끔 다른 위치를 가르키는 경우가 있지만, 다음과 같은 오류에서 가르키는 위치를 확인하면 된다.
can't connect to local mysql server through socket '/run/mysqld/mysqld.sock' (2)
여기서 중요한건 '/run/mysqld/'에서 mysqld.sock을 찾는다는 것이므로 다음과 같이 위치를 지정해준다.
volumes:
- db:/var/run/mysqld
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: <%= ENV['MYSQL_HOST'] %> ##db
username: <%= ENV['MYSQL_USERNAME'] %> ## root
password: <%= ENV['MYSQL_ROOT_PASSWORD'] %> ## password
socket: /var/run/mysqld/mysqld.sock
timeout: 5000
development:
<<: *default
database: developmentdb
# 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: testdb
production:
<<: *default
database: productiondb
default에서
소켓위치를 다음과 같이 명시해준다.
socket: /var/run/mysqld/mysqld.sock
여기서 각 환경에 맞는 database이름을 지정해준다.
development:
<<: *default
database: developmentdb
docker-compose run /<레일즈 웹 컨테이너 이름>/ run rails db:setup
을 해주어 각 환경에 맞는 데이터베이스가 mysql 서버에 생성되도록 한다.
그 후 다음 명령어로 이미지를 빌드하고 컨테이너를 모두 실행시킨다.
docker-compose up -d --build