Để biết phương pháp nhanh hơn, xem phần cuối của bài viết.
Cách Tiếp Cận
Đầu tiên, khởi động một container Ruby tạm thời để tạo dự án, sau đó xây dựng image phát triển cần thiết.
Tạo Dự Án Mới
Để tạo một dự án Rails, khởi động một container Ruby tạm thời:
$ docker run -it -v $(pwd):/app -w /app ruby:3.2 bash
Cài đặt gem Rails bên trong container:
/app# gem install rails
Sau đó tạo dự án:
/app# rails new myapp --database=postgresql --css=sass --skip-bundle
Ở đây, chúng ta sử dụng tham số --skip-bundle
vì đây chỉ là một container tạm thời. Chúng ta sẽ chạy bundle trong container phát triển sau. Bây giờ, container tạm thời đã hoàn thành nhiệm vụ của mình. Thoát khỏi container bằng cách nhấn ctrl-d
hoặc gõ exit
.
Thêm Dockerfile
Thêm một Dockerfile trong thư mục dự án với nội dung sau:
FROM ruby:3.2 # Đặt lại biến môi trường này do image Ruby đặt thành giá trị mặc định của nó
ENV BUNDLE_APP_CONFIG=.bundle # Bỏ chú thích phần này nếu bạn cần cài đặt các phụ thuộc khác
# RUN apt-get update && apt-get install -y --no-install-recommends \
# nodejs \
# npm \
# postgresql-client WORKDIR /app
Đây là một image môi trường phát triển Rails tối thiểu. Nếu cần, bạn có thể cài đặt các phụ thuộc hệ thống khác bằng cách sử dụng apt-get
. Chúng ta không cần xây dựng image ngay bây giờ; chúng ta sẽ xây dựng nó sau bằng cách sử dụng lệnh docker compose.
Thêm docker-compose.yml
Thêm một tệp docker-compose.yml
trong thư mục dự án với nội dung sau:
version: "3.9" services: web: build: . command: bin/rails server -b 0.0.0.0 volumes: - .:/app ports: - 3000:3000 depends_on: - postgres postgres: image: postgres:13 environment: POSTGRES_PASSWORD: postgres
Điều này định nghĩa các dịch vụ web
và postgres
. Dịch vụ web
sẽ xây dựng một image dựa trên Dockerfile trong thư mục hiện tại, gắn thư mục hiện tại vào thư mục /app
bên trong container, mở cổng 3000 và thêm một phụ thuộc vào dịch vụ postgres
. Dịch vụ postgres
sẽ sử dụng image postgres
và đặt mật khẩu ban đầu qua biến môi trường.
Xây Dựng Image
Chạy lệnh sau:
$ docker compose build
Docker Compose sẽ đọc cấu hình trong docker-compose.yml
và xây dựng các image tương ứng. Lưu ý: bạn cần chạy lại lệnh này mỗi khi bạn chỉnh sửa Dockerfile.
Vào Dòng Lệnh
Chạy lệnh sau:
$ docker compose run web bash
Điều này sẽ khởi động container dịch vụ web
và mở một shell bash. Trong shell này, bạn có thể chạy các lệnh cần thiết cho phát triển địa phương, chẳng hạn như bundle install
, bin/rails g
, v.v. Tất cả các thao tác tiếp theo cần được thực hiện bên trong container sẽ được thực hiện thông qua shell này.
Chạy Bundle
Đầu tiên, chạy lệnh sau bên trong container:
/app# bundle config set --local path vendor/bundle
Lệnh này đặt thư mục cài đặt bundle vào thư mục vendor/bundle
dưới dự án. Bằng cách này, mỗi khi bạn cập nhật Gemfile trong quá trình phát triển, bạn sẽ không cần xây dựng lại image.
Sau đó chạy bundle:
/app# bundle install
Lưu ý: nhớ thêm vendor/bundle
vào .gitignore
.
Chuẩn Bị Cơ Sở Dữ Liệu
Trước khi tạo cơ sở dữ liệu, hãy chỉnh sửa cài đặt cơ sở dữ liệu của dự án Rails. Trong môi trường Docker Compose, PostgreSQL và quy trình Rails chạy trong các container khác nhau, tương tự như các máy chủ khác nhau, nơi tên dịch vụ là tên mạng tương ứng của chúng.
Chỉnh sửa database.yml
để thêm nội dung sau vào các phần development
và test
:
host: postgres username: postgres password: postgres
Sau đó chạy lệnh sau:
/app# bin/setup
Điều này sẽ tạo cơ sở dữ liệu tương ứng.
Khởi Động Dịch Vụ Web
Sau khi chuẩn bị, đã đến lúc khởi động dịch vụ web. Mở một terminal khác và chạy lệnh sau:
$ docker compose up
Khi khởi động hoàn tất, mở http://localhost:3000
để xem trang chào mừng của Rails.
Cách Đơn Giản Hơn
Tải xuống ServBay ServBay là một công cụ quản lý môi trường phát triển tất cả trong một hỗ trợ nhiều ngôn ngữ phát triển và các thành phần cơ sở dữ liệu, bao gồm PHP, Node.js, MariaDB (MySQL), PostgreSQL, cũng như các cơ sở dữ liệu NoSQL như Redis và Memcached.
Để thiết lập một môi trường Redis, chỉ cần tải xuống gói Redis trong ServBay và tất cả các cấu hình sẽ được hoàn thành trong vòng 3 phút.