[英]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 rm
或docker 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.sh
和dump.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.