gpt4 book ai didi

ruby-on-rails - rails docker-compose db :create db:migrate 的最佳实践

转载 作者:行者123 更新时间:2023-11-29 13:20:06 25 4
gpt4 key购买 nike

我有一个带有 docker-compose.yml 文件的简单 Rails 应用程序。它由两个容器组成 - 带有 PostgreSQL 的数据库容器和带有 Rails 应用程序的 Web 容器。

在 web 部分的 dockerfile 中,我在 CMD

中有这样的行
CMD RAILS_ENV=production rake db:create db:migrate && \
bundle exec rails s -p 3000 -b '0.0.0.0' --environment=production

所以在 rake db:create db:migrate 行中,如果它是 db 容器的第一次运行,我会创建 db,然后运行 ​​migrate。

但如果它只是 Web 部件的更新 - 我只需要运行 db:migrate 和 db:create(因为它应该)给我错误

ERROR:  database "myapp_production" already exists
STATEMENT: CREATE DATABASE "myapp_production" ENCODING = 'unicode'

一切正常,但我认为有更好的方法。
处理这种情况的最佳方法是什么?

最佳答案

我有相同的开发堆栈,这就是我正在做的。

这是我正在扩展的用于 postgres 的 Dockerfile:

FROM postgres:9.4

ADD db/init.sql /docker-entrypoint-initdb.d/

EXPOSE 5432
CMD ["postgres"]

来自docker postgres文档:

If you would like to do additional initialization in an image derived from this one, add one or more *.sql or *.sh scripts under /docker-entrypoint-initdb.d (creating the directory if necessary). After the entrypoint calls initdb to create the default postgres user and database, it will run any *.sql files and source any *.sh scripts found in that directory to do further initialization before starting the service.

我的init.sql:

CREATE USER database_user;
CREATE DATABASE database_production;
GRANT ALL PRIVILEGES ON DATABASE database_production TO database_user;

之后,我在 web 容器中的 RUN 命令指向 run.sh 脚本:

#!/usr/bin/env bash

echo "Bundling gems"
bundle install --jobs 8 --retry 3

echo "Clearing logs"
bin/rake log:clear

echo "Run migrations"
bundle exec rake db:migrate

echo "Seed database"
bundle exec rake db:seed

echo "Removing contents of tmp dirs"
bin/rake tmp:clear

echo "Starting app server ..."
bundle exec rails s -p 3000 -b '0.0.0.0'

就是这样。我的数据库在 db 容器中创建,而 web 应用仅进行迁移。

关于ruby-on-rails - rails docker-compose db :create db:migrate 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43516333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com