Ruby on Docker

陳漢庭
2 min readJul 1, 2021

以下為本地開發的 Docker 環境,使用rails+sidekiq+redis+mysql+webpacker

database.yml

default: &default
adapter: mysql2
host: <%= ENV['MYSQL_HOST'] %>
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV.fetch('DB_USER') {'root'} %>
password: <%= ENV.fetch('MYSQL_ROOT_PASSWORD') {'password'} %>
port: <%= ENV.fetch('DB_PORT') { 3306 } %>

development:
<<: *default
database: <%= ENV.fetch('DB_DATABASE') {'liteshop'} %>_dev

test:
<<: *default
database: <%= ENV.fetch('DB_DATABASE') {'liteshop'} %>_test

production:
<<: *default
database: <%= ENV['DB_DATABASE'] %>_prd

Dockerfile

ARG RUBY_VERSION
FROM ruby:$RUBY_VERSION
LABEL MAINTAINER=k445566778899k@gmail.com
ARG NODE_MAJOR
ARG BUNDLE_VERSION
RUN apt-get update
RUN apt-get install build-essential -y
# RUN apt-get install -y \
# libmcrypt-dev \
# libmysqlclient-dev \
RUN apt-get install -y libmcrypt-dev
RUN apt-get install -y libmariadb-dev-compat libmariadb-dev
RUN gcc --version
RUN make --version
RUN curl -SL https://deb.nodesource.com/setup_$NODE_MAJOR.x | bash -
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update
RUN apt-get install nodejs -y
RUN apt-get install yarn -y
COPY Gemfile Gemfile.lock ./
RUN gem install bundler -v $BUNDLE_VERSION
RUN bundle install -j $(nproc)RUN mkdir -p /app
WORKDIR /app

docker-compose.yml

version: '3.8'
services:
base: &base
build:
args:
RUBY_VERSION: '2.6.3'
NODE_MAJOR: '13'
BUNDLE_VERSION: '2.1.2'
context: .
dockerfile: ./Dockerfile
backend: &backend
<<: *base
volumes:
- .:/app:cached
- rails_cache:/app/tmp/cache
- bundle:/usr/local/bundle
- node_modules:/app/node_modules
- packs:/app/public/packs
depends_on:
- db
- redis
app:
<<: *backend
command: bundle exec rails server -b 0.0.0.0
ports:
- '3000:3000'
environment:
MYSQL_HOST: localhost
MYSQL_ROOT_PASSWORD: password
DATABASE_URL: 'mysql2://db'
DB_USER: root
DB_DATABASE: liteshop
RAILS_ENV: development
RAILS_MAX_THREADS: 5
- WEBPACKER_DEV_SERVER_HOST=webpacker
- BUNDLE_PATH=/bundle/vendor
redis:
image: redis
ports:
- 6379:6379
volumes:
- ./redis:/data
command: redis-server --appendonly yes
webpacker:
<<: *backend
command: ./bin/webpack-dev-server
ports:
- '3035:3035'
environment:
- WEBPACKER_DEV_SERVER_HOST=0.0.0.0
db:
image: mysql:5.7
restart: always
ports:
- '3307:3306'
volumes:
- 'mysql:/var/lib/mysql'
sidekiq:
<<: *backend
command: bundle exec sidekiq
environment:
- DATABASE_URL=mysql2://db
- REDIS_URL=redis://redis:6379/1
# docker-compose down時,想辦法讓資料不要自動清除,沒錯,關鍵字就是volumes
volumes:
rails_cache:
bundle:
node_modules:
packs:
mysql:
redis:

常用指令

docker-compose build
docker-compose up -d db

docker-compose run --rm app bundle install
docker-compose run --rm app bundle exec rake webpacker:install
docker-compose up app

docker-compose run --rm app bin/rails db:create
docker-compose run --rm app bin/rails db:migrate
# 刪除正在運行的 port
# rm tmp/pids/server.pid

config/initializers/sidekiq.rb

# 如果不啟用 sidekiq 可以打開
if Rails.env.development?
# require 'sidekiq/testing'
# Sidekiq::Testing.inline!
end


Sidekiq.configure_client do |config|
config.client_middleware do |chain|
config.redis = { url: ENV.fetch('REDIS_URL', 'redis://localhost:6379/1') }

# accepts :expiration (optional)
chain.add Sidekiq::Status::ClientMiddleware, expiration: 30.minutes # default
end
end

Sidekiq.configure_server do |config|
config.redis = { url: ENV.fetch('REDIS_URL', 'redis://localhost:6379/1') }

config.server_middleware do |chain|
# accepts :expiration (optional)
chain.add Sidekiq::Status::ServerMiddleware, expiration: 30.minutes # default
end
config.client_middleware do |chain|
# accepts :expiration (optional)
chain.add Sidekiq::Status::ClientMiddleware, expiration: 30.minutes # default
end
end

Reference

Webpack 環境設定

Mysql 環境設定

Sidekiq 環境設定

--

--

陳漢庭

由於零散的紀錄過了一段時間之後就看不懂了,於是為了強迫自己用故事的方式記錄學到的東西,就開啟我的發文之路。