Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 错误:在docker容器中导入Postgres数据库_Ruby On Rails_Bash_Postgresql_Docker_Docker Compose - Fatal编程技术网

Ruby on rails 错误:在docker容器中导入Postgres数据库

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容器中运行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 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
run
docker 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