学习用于Rails的混合开发Docker Compose设置

236 阅读4分钟

很多开发者都会选择将他们的开发设置docker化,或者保持原样。还有一种可行的混合方法是将Docker Compose与本地进程相结合。

我通常是在直接运行东西或创建Vagrant环境的阵营中,这些环境与我通常运行的东西非常相似。我也经常考虑引入比我需要的更多的层,所以如果可以的话,我通常不运行Docker。

然而,我意识到,在常规的Puma和Sidekiq进程中运行Docker Compose设置,实际上是一个相当不错的甜蜜点。这就是我们在Phrase使用的东西。

为什么,但为什么

对整个开发环境进行docker化的论点通常是为了与生产相匹配。这意味着运行相同版本的数据库、实用程序和服务。将其正式化也意味着每个团队成员可以立即开始工作或返回到工作设置。

我非常理解这种说法,因为这也是我在自己的项目中通常有一个Vagrant环境的原因。即使我在没有虚拟机的情况下进行开发,我也会写一个Vagrant文件,以便在发生任何故障时能够运行。所以我明白了。

但这与Docker不一样。在我看来,Docker化整个开发设置需要一个有点不同的心态。虽然抛开虚拟机听起来是一种改进,但性能可能仍然受到影响。

让你想到,将所有东西都Docker化是否值得。由于这个原因,似乎完整的Docker设置是少数。

不过,我们能不能不要太过分,仍然享受一些Docker?什么是替代方案?

替代方案是像往常一样安装Ruby、Rails和系统工具,同时将其他部分进行Docker化。这样我们就解决了管理不同数据库的恼人部分,代价是没有解决系统依赖性的平价问题。

这并不完美,但它很简单。这是以20%的努力获得80%的好处。最终的结果应该是照常运行bin/devbin/rails test 。没有任何一条命令需要在容器中运行。

实施

有三个步骤可以把一个普通的设置变成一个混合的Docker Compose设置。我们将编写数据库的docker-compose.yml 规范,更新Rails配置文件中的端口,最后将Docker Compose加入我们的Procfile.dev

一个典型的带有关系型数据库和Redis服务器的新Rails应用程序的Docker Compose文件可能看起来像下面这样。

# docker-compose.yml
version: '3.7'

services:
  postgres:
    image: postgres:14.2
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - 54320:5432
    volumes:
      - postgres:/var/lib/postgresql/data

  redis:
    image: redis:5.0.4
    command: redis-server /etc/redis.conf
    ports:
      - 63790:6379
    volumes:
      - redis:/data

volumes:
  redis:
  postgres:

你可能注意到的第一件事是,它非常简短和易懂。两个数据库服务,每个都有一个数据卷和我们暴露给主机的端口。PostgreSQL服务器运行时有一个默认密码,而我们可以为Redis省略密码。

记住,其他一些服务或数据库可能需要不同的开发和测试条目,但这里没有必要,因为我们可以在两个环境中使用相同的服务器(数据库名称会不同)。

使用这个Compos设置运行就像输入docker-compose up ,并更新你的Rails配置一样简单。

如果你必须用sudo 来运行Docker,先把你的用户添加到docker组。

$ sudo gpasswd -a $USER docker
$ newgrp docker

并启动Docker Compose。

$ docker-compose up

docker-compose up 应该下载数据库镜像并为你启动这两个服务。

现在你的数据库已经准备好了,更新Rails的配置。

# config/database.yml
development:
  <<: *default
  username: postgres
  password: postgres
  # 5432 for local, 54320 for Docker Compose
  port: 54320
  host: "0.0.0.0"
  database: app_development
...

# config/cable.yml
development:
  adapter: redis
  # 6379 for local, 63790 for Docker Compose
  url: redis://localhost:63790/1
...

在这一点上,你应该能够针对这些新的数据库运行bin/rails s,bin/rails test 和其他通常的命令。

最后,为了把这些东西放在一起,我们将更新Procfile.dev

$ cat Procfile.dev
web: bin/rails server -p 3000
css: yarn build:css --watch
live_reload: bin/guard
js: yarn build --watch
services: docker-compose up

结语

如果我们现在想在开发中启动Rails,我们所要做的就是像平常一样运行bin/dev

我们还没有用新的设置解决所有问题,但我们以很少的努力获得了很多。我想这就是我的工具包中的设置。