错误: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_name
( db
)后,它得到工作。