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_name
在docker-compose.yml
文件中添加环境变量,以便创建数据库,并在运行应用程序(docker-compose up
)之后,我将导入数据库.但得到一个错误:web_1 exited with code 0
.
我很困惑,为什么我得到这个错误(在第一和第三种方法),似乎是在docker-compose
文件中搞砸了.
您需要将转储装入容器,以便可以访问它.在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命令来调用它.或者,您可以让入口点脚本检查是否存在转储文件,如果存在,则解压缩并导入它......无论您需要做什么.
docker-compose up -d web
Run Code Online (Sandbox Code Playgroud)
如果您是手动执行此操作以准备新设置,那么您就完成了.如果您需要将其自动化为工具链,则可以在脚本中执行此操作.只需单独启动容器,在其间进行数据库导入,并用于sleep
覆盖任何启动延迟.
container_name
我通过添加一个for db 容器让它工作。我的db
容器有不同的名称 ( app_name_db_1
),并且我正在连接到名为 的容器db
。
给出硬编码container_name
( db
) 后,它就开始工作了。
归档时间: |
|
查看次数: |
1254 次 |
最近记录: |