错误:Docker容器中的Postgres数据库导入

我在Docker容器中运行一个ruby应用程序。 我想创build,然后在postgres容器中恢复数据库转储。 但是我

以下是我迄今为止所做的:

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

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

结果:数据库创build,但轨道服务器退出代码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" 

结果 :数据库创build并恢复数据。 但是另一个容器运行时,使用docker-compose up运行web应用程序服务器。

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 

有人可以帮助创build和导入数据库吗?

编辑:

我已经尝试了更多的方法,在docker-compose.yml文件中添加POSTGRES_DB=db_name环境variables,以便创build数据库,并在运行应用程序( docker-compose up )之后,我将导入数据库。 但是得到一个错误: web_1 exited with code 0

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

设置数据库转储装载

您需要将转储装载到容器中,以便可以访问它。 在docker-compose.yml中是这样的:

 db: volumes: - './db_dump:/db_dump' 

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

启动数据库容器

在环境中使用POSTGRES_DB (如您在问题中提到的)自动创build数据库。 开始db本身,没有轨服务器。

 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-compose up -d web 

自动执行此操作

如果你正在手动准备一个新的设置,那么你就完成了。 如果你需要把它自动化成一个工具链,你可以在脚本中做一些这些东西。 只需单独启动容器,在两者之间进行数据库导入,并使用sleep来覆盖启动延迟。

 web_1 exited with code 0 

你有没有试过检查web_1容器的日志? docker-compose logs web

我强烈build议你不要手动初始化你的db容器,在启动容器的过程中自动进行。

查看postgres的入口点 ,我们可以把db_dump.gz放到容器的/docker-entrypoint-initdb.d/目录下,它会自动执行,所以docker-compose.yml可以是:

 db: volumes: - './initdb.d:/docker-entrypoint-initdb.d' 

把你的db_dump.gz放到本地机器上的./initdb.d

当你使用命令docker-compose run -d db

你运行一个单独的容器,这意味着你正在运行3个容器,其中1是应用程序2是dbs。 使用上述命令运行的容器不会成为服务的一部分。 撰写使用单独的数据库。

所以,而不是运行docker-compose up -d db运行docker-compose up -d并继续与您的脚本

我通过为db容器添加一个container_name来解决这个问题。 我的db容器具有不同的名称( app_name_db_1 ),我正在连接到一个名为db的容器。

给硬编码的container_namedb )后,它得到工作。