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

Atu*_*uri 11 postgresql bash ruby-on-rails docker docker-compose

我在docker容器中的rails应用程序上运行ruby.我想在postgres容器中创建然后恢复数据库转储.但是我

以下是我到目前为止所做的事情:

1)/docker-entrypoint-initdb.d文件夹中添加了bash脚本.脚本只是创建数据库:

psql -U docker -d postgres -c 'create database dbname;'

结果:数据库已创建,但rails服务器已退出,代码为0.错误:web_1 exited with code 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"
Run Code Online (Sandbox Code Playgroud)

结果:数据库创建和恢复数据.但是在运行Web应用程序服务器时运行另一个容器docker-compose up.

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
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙创建和导入数据库吗?

编辑:

我已经尝试了另外一种方法,POSTGRES_DB=db_namedocker-compose.yml文件中添加环境变量,以便创建数据库,并在运行应用程序(docker-compose up)之后,我将导入数据库.但得到一个错误:web_1 exited with code 0.

我很困惑,为什么我得到这个错误(在第一和第三种方法),似乎是在docker-compose文件中搞砸了.

Dan*_*owe 5

设置数据库转储装载

您需要将转储装入容器,以便可以访问它.在docker-compose.yml中有这样的东西:

db:
  volumes:
    - './db_dump:/db_dump'
Run Code Online (Sandbox Code Playgroud)

创建一个名为的本地目录并将文件db_dump放在db_dump.gz那里.

启动数据库容器

POSTGRES_DB在环境中使用(如您在问题中提到的)自动创建数据库.从db没有rails服务器开始.

docker-compose up -d db
Run Code Online (Sandbox Code Playgroud)

导入数据

等待几秒钟以使数据库可用.然后,导入您的数据.

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
Run Code Online (Sandbox Code Playgroud)

您也可以创建一个脚本来执行此导入,将其粘贴到您的图像中,然后使用单个docker-compose命令来调用它.或者,您可以让入口点脚本检查是否存在转储文件,如果存在,则解压缩并导入它......无论您需要做什么.

启动rails服务器

docker-compose up -d web
Run Code Online (Sandbox Code Playgroud)

自动执行此操作

如果您是手动执行此操作以准备新设置,那么您就完成了.如果您需要将其自动化为工具链,则可以在脚本中执行此操作.只需单独启动容器,在其间进行数据库导入,并用于sleep覆盖任何启动延迟.


Atu*_*uri 1

container_name我通过添加一个for db 容器让它工作。我的db容器有不同的名称 ( app_name_db_1),并且我正在连接到名为 的容器db

给出硬编码container_name( db) 后,它就开始工作了。