[英]Error: Postgres database import in docker container
我在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"
結果 :數據庫創建和恢復數據。 但是使用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
有人可以幫忙創建和導入數據庫嗎?
編輯:
我已經嘗試了另一種方法,在docker-compose.yml
文件中添加POSTGRES_DB=db_name
環境變量,以便創建數據庫,並在運行應用程序( docker-compose up
)之后,我將導入數據庫。 但是收到錯誤: web_1 exited with code 0
。
我很困惑,為什么我得到這個錯誤(在第一和第三種方法),似乎是在docker-compose
文件中搞砸了。
您需要將轉儲裝入容器,以便可以訪問它。 在docker-compose.yml中有這樣的東西:
db:
volumes:
- './db_dump:/db_dump'
創建一個名為db_dump
的本地目錄,並將db_dump.gz
文件放在那里。
在環境中使用POSTGRES_DB
(如您在問題中所提到的)自動創建數據庫。 在沒有rails服務器的情況下自行啟動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命令來調用它。 或者,您可以讓入口點腳本檢查是否存在轉儲文件,如果存在,則解壓縮並導入它......無論您需要做什么。
docker-compose up -d web
如果您是手動執行此操作以准備新設置,那么您就完成了。 如果您需要將其自動化為工具鏈,則可以在腳本中執行此操作。 只需單獨啟動容器,在其間執行db導入,並使用sleep
來覆蓋任何啟動延遲。
web_1 exited with code 0
您是否嘗試過檢查web_1
容器的日志? docker-compose logs web
我強烈建議您不要手動初始化數據庫容器,在啟動容器的過程中自動進行。
查看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。 使用上述命令運行的容器將不是服務的一部分。 compose正在使用單獨的db。
因此,而不是運行docker-compose up -d db
運行docker-compose up -d
並繼續執行腳本
我通過為db容器添加container_name
來實現它。 我的db
容器有不同的名稱( app_name_db_1
),我連接到名為db
的容器。
在給出硬編碼的container_name
( db
)之后,它就可以運行了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.