簡體   English   中英

Docker-Compose Postgresql導入轉儲

[英]Docker-Compose Postgresql import dump

我有關於docker和postgres的問題。 每次docker啟動時我都要設置一個新的postgres數據庫並想要導入給定的轉儲。

我的問題就像,但答案對我來說還不夠: Docker postgres不會在docker-entrypoint-initdb.d中運行init文件

多克爾 - 撰寫:

postgres:
  environment:
   - POSTGRES_USER=****
   - POSTGRES_PASSWORD=****
   - POSTGRES_DB=****
build:
  context: .
  dockerfile: dockerfile-postgres

我的Dockerfile :(我已經嘗試使用.sh結尾的腳本)

FROM postgres
ADD dump.sql /docker-entrypoint-initdb.d/

根據https://hub.docker.com/_/postgres/ dump.sql必須用於導入數據庫。

使用docker啟動應用程序只會給出:

postgres_1     | LOG:  invalid record length at 0/1708600
postgres_1     | LOG:  redo is not required
postgres_1     | LOG:  MultiXact member wraparound protections are now enabled
postgres_1     | LOG:  database system is ready to accept connections
postgres_1     | LOG:  autovacuum launcher started

除了我測試我的數據庫是否已導入,我的數據庫中沒有表。 我做錯了什么(文件在目標系統上讀取和執行)? 用psql導入它沒問題,所以我的轉儲是正確的。

我希望你能幫助我,我想提前感謝你。

好吧,我找到了訣竅,我必須執行“docker-compose rm”才能執行此文件夾中的腳本和sql文件。 一旦構建並且未被刪除,則忽略init文件夾。

更新我再次遇到這個問題,這次刪除圖像docker創建解決了問題。

它發生的原因很可能是因為

然后,負責以字母順序運行/docker-entrypoint-initdb.d/*文件的initdb腳本docker-entryfile.sh僅在創建卷時首次運行。

你可以在這里看到一些細節。

解決方案(與我合作)這是我的docker-compose文件的片段

  postgres_service:
    build:
      context : docker-postgres
      dockerfile: Dockerfile-base
    image: 'datahub/postgres:development'
    user: postgres
    ports:
      - "5432:5432"
    env_file:
      - credentials/postgres/development.env
    volumes:
      - /Users/yogesh.yadav/DockerData/datahub/postgresql/data:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - datahubnetwork

腳步 -

1) docker-compose -f docker-compose-filename.yml down

要么

docker-compose -f docker-compose-filename.yml stop postgres_service

2)刪除postgres_service docker服務附帶的卷/卷(/Users/yogesh.yadav/DockerData/datahub/postgresql/data)。 您可以手動或通過docker-compose rmdocker volume rm執行此操作。 在刪除之前,請確定附加到該postgres服務的卷。 更多信息在這里

3)Docker通過構建映像並運行它們來使用非常好的緩存管理。 如果您沒有修改Dockerfile ,則Dockerfile將從緩存中運行已構建的映像並運行它。 所以我建議刪除postgres_service的圖像。

列出圖像

docker images -a

輸出 -

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
datahub/postgres          development         e7707e670ad4        35 minutes ago      265 MB

刪除該圖像(如果需要,使用-f)

docker rmi IMAGE_ID_HERE

4)再次重啟您的服務

docker-compose -f docker-compose-filename.yml up --build postgres_service

這次你可以看到你的docker-entrypoint.shdump.sql將會執行。

這里的答案在某種程度上解決了我的問題,但是讓docker-entrypoint-initdb/*.sql腳本工作的最后一步是確保sql腳本本身沒有語法問題(因為我改變了SQL版本,所以我遇到了問題)在我的Dockerfile中)。

如果存在,則docker-entrypoint-initdb/*.sql腳本中的所有內容似乎都會回滾。

要檢查是否存在任何語法腳本問題(或其他問題),您可能會發現查看docker日志很有用:

$ docker ps -all

注意: -all確保它列出那些可能無法啟動的圖像。

找到剛剛創建的圖像,並查找容器ID,該ID應為12個字符的哈希值:

$ docker logs baf32ff7ec03

請記住,您仍然需要遵循其他答案 - 這些是以前構建的圖像並刪除您的數據文件夾(如果需要,請備份)。

暫無
暫無

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

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