用docker-compose构建开发环境的方法
本文档将详细介绍使用Rails + PostgreSQL创建的应用程序,通过使用Docker Compose进行Docker化的方法。

FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile Gemfile.lock /myapp/
RUN bundle install
使用apt-get update命令来更新软件包列表,然后使用apt-get install命令安装所需的软件包。
使用-y选项来跳过确认提示,实现自动安装。
version: '3'
volumes:
db-data:
services:
db:
image: postgres:12
volumes:
- 'db-data:/var/lib/postgresql/data'
environment:
- 'POSTGRES_USER=postgres'
- 'POSTGRES_PASSWORD=postgres'
web:
build: .
command: >
bash -c "rm -f tmp/pids/server.pid && rails db:create && rails db:migrate && rails s -b 0.0.0.0"
volumes:
- .:/myapp
ports:
- "3000:3000"
environment:
- 'DATABASE_PASSWORD=postgres'
depends_on:
- db
tty: true
stdin_open: true
links:
- db
volumes:
db-data:
为了保留数据即使结束或删除容器,将数据库的内容与主机同步。
首先是关于Web容器的内容。Web容器就像其名称一样,是一个用于托管Web服务器的容器,在这里我们运行Rails应用。
web:
build: .
command: >
bash -c "rm -f tmp/pids/server.pid && rails db:create && rails db:migrate && rails s -b 0.0.0.0"
volumes:
- .:/myapp
ports:
- "3000:3000"
environment:
- 'DATABASE_PASSWORD=postgres'
depends_on:
- db
tty: true
stdin_open: true
links:
- db
command: >
bash -c "rm -f tmp/pids/server.pid && rails db:create && rails db:migrate && rails s -b 0.0.0.0"
在`command`中,您可以指定在容器启动时要执行的命令。以下命令将按顺序执行。
在bash中执行后续的字符串
强制删除上一个服务器进程的PID文件。这是为了防止应用服务器在之前的会话中没有进行清理而出现问题。如果存在server.pid文件,将会导致WEB服务器被判断为正在运行(有进程),并产生以下错误。
已有服务器正在运行。请检查/tmp/pids/server.pid文件。退出。
创建Rails数据库。
运行数据库迁移命令。
运行 rails s -b 0.0.0.0 命令,启动 Rails 服务器。
volumes:
- .:/myapp
将主机PC和容器内的文件进行同步。同步主机PC的当前目录和容器内的/myapp目录。
environment:
- 'DATABASE_PASSWORD=postgres'
在容器中设置环境变量。将’postgres’设为数据库的密码。
tty: true
stdin_open: true
在中文中可以表达为:使用Docker命令行运行和交互的等效命令是
depends_on:
- db
设置容器之间的依赖关系。在db容器启动之后启动web容器。
“由于web容器需要db容器,所以请从db容器启动web容器”。
links:
- db
将网络容器和数据库服务进行链接,以实现通信。
db:
image: postgres:12
volumes:
- 'db-data:/var/lib/postgresql/data'
environment:
- 'POSTGRES_USER=postgres'
- 'POSTGRES_PASSWORD=postgres'
volumes:
- 'db-data:/var/lib/postgresql/data'
将前述的db-data卷挂载到Postgres的数据目录。
配置文件/database.yml
.
.
.
# 開発環境
default: &default
adapter: postgresql
encoding: unicode
host: db
user: postgres
port: 5432
password: <%= ENV.fetch("DATABASE_PASSWORD") %>
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
.
.
.
adapter设置用于Rails应用程序使用的数据库类型。在本例中,我们使用PostgreSQL,因此将其设置为’postgresql’。
值得一提的是,根据数据库类型不同,值会有所不同,例如,对于MySQL,值为’mysql12’,对于SQLite,值为’sqlite3’。
端口设置为’5432’。这是PostgreSQL数据库的默认TCP端口号。一般情况下,使用’5432’是使用postgres的常见做法。
密码与docker-compose.yml文件中指定的db容器部分的’POSTGRES_PASSWORD=postgres’相链接。
启动应用程序
如果到这一步已经完成,那么只需通过docker-compose up -d命令启动容器,并可以通过localhost:3000访问应用程序。
-d选项:在后台运行容器。
以下是将Web应用程序(Ruby on Rails7.6 × postgres12)进行Docker化的步骤。