ruby-on-rails - Dockerized 应用程序适用于带有 PSQL 的 Rails,但数据库容器不工作

标签 ruby-on-rails postgresql docker docker-compose

我正在对 Rails 应用程序进行 docker 化,应用程序中有一个运行 psql 命令的脚本。 这在 docker 之外工作正常,但我在 docker 容器运行时,网络应用程序和数据库是不同的服务。

所以当Rails服务中的脚本有psql命令时,就会抛出错误。在这种情况下,它会抛出“dropdb:找不到命令。”

如何让 Rails 应用程序能够运行包含 psql 命令的脚本?

我认为我可以通过将 Postgres 的位置添加到 PATH 来解决这个问题。 环境路径 $PATH:/usr/pgsql-9.6/bin:$PATH 但我认为我需要获得其他服务的路径才能做到这一点。

我也看到有可能 link我的两项服务,例如

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

从运行 rails 的容器内部访问 psql 命令的最佳实践是什么?

最佳答案

首先,我不认为像您使用 psql 命令那样运行迁移是个好主意。我建议考虑以下几点:

我建议使用可以运行数据库迁移的 native Rails 库。此工具将使用您自己的数据库凭据,并将使用您的应用程序提供的数据库驱动程序。我不知道this documentation from rubyonrails.org就足够了,但这是开始的好方法。

Migrations are a convenient way for you to alter your database in a structured and organized manner. You could edit fragments of SQL by hand but you would then be responsible for telling other developers that they need to go and run them. You’d also have to keep track of which changes need to be run against the production machines next time you deploy.

https://guides.rubyonrails.org/v3.2/migrations.html

但无论如何,我会回答你的问题,因为你可以问知道以前的建议。

只需三个步骤即可完成您想要的。

首先,这是正确的,你可以像你说的那样链接容器:

web:
  build: .
  links:
    - "db:db"
db:
  image: postgres

这意味着您可以在 Web 应用程序中使用“db”作为数据库的主机名。

第二个是允许从 Rails 容器连接到 PostgreSQL 容器。

如果 PostgreSQL 已经接受连接,则可能不需要此步骤。

为此,您必须编辑 PostgreSQL 数据目录中的 pg_hba.conf 文件。为什么?因为您需要从容器外部批准连接,从您的 Rails 应用程序。

pg_hba.conf 文件如下所示:

# Allow any user on the local system to connect to any database with
# any database user name using Unix-domain sockets (the default for local
# connections).
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust

可以关注官方文档here (for 9.6 version) .

你的看起来像:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             all                     md5

或者:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    database_name   username        docker_network          md5

其中database_name为应用数据库名,username为数据库用户名,docker_network为Docker网络IP(例如172.17.0.0/24)

这将允许您的 Rails 容器访问数据库。

如果您不想在删除容器后丢失此配置,请查看 Docker 卷:Volumes on docs.docker.comdocker-compose volumes also on docs.docker.com .

第三步也是最后一步,为了在 PostgreSQL 容器以外的其他地方运行 psql 命令,您需要在容器中安装该工具。这意味着您需要将它安装在您的 Docker 镜像中。

如果您的 Rails 镜像是基于 Ubuntu/Debian/Mint/... 您可以执行以下操作:

sudo apt-get install postgresql-client
sudo ln -s /usr/lib/libpq.so.5.4  /usr/lib/libpq.so  # adapt to the actual postgres version

找到上一行here (Install PostgreSQL Client driver) .

你必须像这样运行你的psql:

PGPASSWORD=<yourpass> psql -U username -H db < script.sql

# For manual usage, prompt the password
psql -U username -H db < script.sql

这是非常不安全的。这就是为什么我建议在此答案开头避免使用此解决方案。

关于ruby-on-rails - Dockerized 应用程序适用于带有 PSQL 的 Rails,但数据库容器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51538566/

相关文章:

ruby-on-rails - 为什么 Rubocop 提高 “parser/current recognizes 2.5.5-compliant syntax, but you are running 2.5.3” ?

jquery - 通过 JQuery 将 JSON 发布到 Rails

ruby-on-rails - 评估数组是否有 ruby​​ 中的任何项目

database - 有关 PostgreSQL 服务重新加载的文档不会中断打开的事务?

sql - 从按两列分组的组中选择具有最大值的行(PSQL)

docker - 在 perl6 中 sleep 在 docker-compose 上无法正常工作

ruby-on-rails - 如何在 Rails 4 中搜索关联

sql - 从连接表中选择或计数

apache - 同一个 docker 容器上的多个虚拟主机

docker - Linux + Docker-如何从Docker容器中运行主机的应用程序?