Ruby on rails 错误:在docker容器中导入Postgres数据库
我正在docker容器中运行RubyonRails应用程序。我想在postgres容器中创建并恢复数据库转储。 但是我 以下是我迄今为止所做的工作: 1)在Ruby on rails 错误:在docker容器中导入Postgres数据库,ruby-on-rails,bash,postgresql,docker,docker-compose,Ruby On Rails,Bash,Postgresql,Docker,Docker Compose,我正在docker容器中运行RubyonRails应用程序。我想在postgres容器中创建并恢复数据库转储。 但是我 以下是我迄今为止所做的工作: 1)在/docker entrypoint initdb.d文件夹中添加了bash脚本。脚本仅用于创建数据库: psql-U docker-d postgres-c'create database dbname;' 结果:已创建数据库,但rails服务器已退出,代码为0。错误:web\u 1已退出,代码为0 2)添加了要在docker compos
/docker entrypoint initdb.d
文件夹中添加了bash脚本。脚本仅用于创建数据库:
psql-U docker-d postgres-c'create database dbname;'代码>
结果:已创建数据库,但rails服务器已退出,代码为0。错误:web\u 1已退出,代码为0
2)添加了要在docker compose up之前执行的脚本
# Run docker db container
echo "Running db container"
docker-compose run -d db
# Sleep for 10 sec so that container have time to run
echo "Sleep for 10 sec"
sleep 10
echo 'Copying db_dump.gz to db container'
docker cp db_dump/db_dump.gz $(docker-compose ps -q db):/
# Create database `dbname`
echo 'Creating database `dbname`'
docker exec -i $(docker-compose ps -q db) psql -U docker -d postgres -c 'create database dbname;'
echo 'importing database `dbname`'
docker exec -i $(docker-compose ps -q db) bash -c "gunzip -c /db_dump.gz | psql -U postgres dbname"
结果:创建数据库并还原数据。但另一个容器在运行web应用程序服务器时使用docker compose up
# Run docker db container
echo "Running db container"
docker-compose run -d db
# Sleep for 10 sec so that container have time to run
echo "Sleep for 10 sec"
sleep 10
echo 'Copying db_dump.gz to db container'
docker cp db_dump/db_dump.gz $(docker-compose ps -q db):/
# Create database `dbname`
echo 'Creating database `dbname`'
docker exec -i $(docker-compose ps -q db) psql -U docker -d postgres -c 'create database dbname;'
echo 'importing database `dbname`'
docker exec -i $(docker-compose ps -q db) bash -c "gunzip -c /db_dump.gz | psql -U postgres dbname"
docker--compose.yml
:
version: '2'
services:
db:
image: postgres
environment:
- POSTGRES_PASSWORD=docker
- POSTGRES_USER=docker
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0' -d
image: uname/application
links:
- db
ports:
- "3000:3000"
depends_on:
- db
tty: true
有人能帮忙创建和导入数据库吗
编辑:
我尝试了另一种方法,在docker compose.yml
文件中添加POSTGRES\u DB=DB\u name
环境变量,以便创建数据库,运行应用程序(docker compose up
)后,我将导入数据库。但出现错误:web\u 1已退出,代码为0
我不明白为什么会出现这个错误(在第一种和第三种方法中),似乎是因为docker compose
文件中出现了问题。当您使用命令时
docker compose运行-d数据库
运行一个单独的容器意味着运行3个容器,其中1个是应用程序2个是数据库。使用上述命令运行的容器将不是服务的一部分。compose使用单独的数据库
因此,不要运行docker compose up-d db
rundocker compose up-d
并继续执行脚本设置数据库转储装载
您需要将转储装载到容器中,以便访问它。docker-compose.yml中的类似内容:
db:
卷数:
-“./db\u转储:/db\u转储”
创建一个名为db_dump
的本地目录,并将您的db_dump.gz
文件放在那里
启动数据库容器
在环境中使用POSTGRES\u DB
(如您在问题中所述)自动创建数据库。自己启动db
,不使用rails服务器
docker compose up-d db
导入数据
等待几秒钟,数据库才可用。然后,导入数据
docker compose exec db gunzip/db_dump/db_dump.gz
docker compose exec db psql-U postgres-d dbname-f/db_dump/db_dump.gz
docker compose exec db rm-f/db_dump/db_dump.gz
您也可以创建一个脚本来执行此导入,将其粘贴到图像中,然后使用单个docker compose命令调用该脚本。或者,您可以让您的入口点脚本检查是否存在转储文件,如果存在,请解压缩并导入它。。。不管你需要做什么
启动rails服务器
docker编写up-d web
自动化
如果您是为了准备一个新的设置而手工操作,那么您就完成了。如果您需要将其自动化到工具链中,您可以在脚本中完成其中的一些工作。只需分别启动容器,在两者之间执行db导入,并使用sleep
覆盖任何启动延迟
web_1 exited with code 0
您是否尝试检查web\u 1
容器的日志<代码>docker撰写日志网站
我强烈建议您不要手动初始化db容器,而是在启动容器的过程中自动初始化
仔细看,我们可以将db_dump.gz
放入容器的/docker entrypoint initdb.d/
目录,它将自动执行,因此docker compose.yml
可以是:
db:
volumes:
- './initdb.d:/docker-entrypoint-initdb.d'
然后将您的
db\u dump.gz
放入本地机器上的/initdb.d
。我通过为db container添加一个容器名来实现它。我的db
容器有不同的名称(app\u name\u db\u 1
),我正在连接一个名为db
的容器
在给出硬编码的容器名称后(db
),它开始工作。我将docker compose up-d db
替换为运行docker compose up-d
,成功创建了数据库,但web服务器退出,代码为0。与我在第一种方法中遇到的错误相同(在docker entrypoint initdb.d
文件夹中使用脚本)。您的数据大小是否超过或大约为10 GB?Docker容器在没有卷mapNo的情况下存储的数据不会超过10GB,只有300MB左右。虽然,我现在只是创建数据库,而不是导入dump。如果不创建数据库,只需运行docker compose up-d命令即可。是出口吗?如果不是用户docker exec-it containerid/bin/bash,请手动尝试。如果不创建数据库并运行docker compose up
,将导致应用程序服务器崩溃,因为数据库尚未创建。不幸的是,收到相同的错误,退出,代码为0
。不确定此错误的含义:(即使我只在docker compose.yml
(POSTGRES\u DB
)中提供了数据库名env变量,我也会遇到同样的错误。).@AtulKhanduri您可以拥有rails应用程序输出日志或某种调试吗?正在退出的是您的web容器,但如果不查看rails应用程序的内容,就无法说出问题所在。您也可以尝试docker compose logs web
查看web容器输出的内容。@AtulKhanduri还可以使用docker文件来构建y我们的网络容器将有助于人们破解这个问题。请将其添加到您的问题文本中。谢谢Dan。虽然这个答案不是我问题的实际解决方案,但它帮助了我。因此,我已经向您颁发了50份赏金。我还添加了。您在网络容器中放置的数据库主机是什么?。主机应该是db。您可以检查文档吗ker网络日志导致e