簡體   English   中英

錯誤:在docker容器中導入Postgres數據庫

[英]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命令來調用它。 或者,您可以讓入口點腳本檢查是否存在轉儲文件,如果存在,則解壓縮並導入它......無論您需要做什么。

啟動rails服務器

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_namedb )之后,它就可以運行了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM