簡體   English   中英

Dockerized Postgresql無法訪問自定義映像上的postgresql.conf

[英]Dockerized Postgresql cannot access postgresql.conf on custom image

我正在嘗試/調試/學習/破解Docker。 我目前正在編寫Docker代碼以為我的應用程序創建快照測試環境。

通過snapshotted我的意思是每次重啟時都會有意重置數據庫,以便可以在特定時間使用舊數據 在我的情況下,特有的是我想在構建時而不是在啟動時填充Postgresql數據庫。 Postgresql映像已准備就緒,可以在容器啟動時使用sql腳本填充db,但是需要花費幾個小時。

我的應用程序是由運行我的WAR的Tomcat 8.5服務器和一個Postgresql數據庫組成的,這是我現在問題的重點。 在編寫完整代碼時,我正在創建一個Gist。

我完成的代碼

關於Gist的完整代碼

遵循了有關如何使用完整數據庫構建 Postgres的Docker映像的教程 ,而不是讓Postgres在啟動時自行填充。 這是因為我有一個百萬記錄數據庫,並且只有sysop給我的.sql.gz轉儲。

所以Dockerfile的相關部分是

WORKDIR /opt/setup/
COPY db-setup.sh /opt/setup/
COPY db-pack.sh /opt/setup/
COPY db-run.sh /opt/setup/

RUN ./db-setup.sh
RUN ./db-pack.sh

#VOLUME $PGDATA (Note it is commented out, now)

EXPOSE 5432

db-setup.sh在映像構建上運行,並從data-scripts.d選擇文件。 當然,我不允許共享轉儲的內容,但這是一個普通的.sql.gz,其中包含大量OID ,需要大量時間來還原。 Gist中顯示的db-setup.sh來自本教程和原始Postgres圖像,因此它可以正確處理壓縮(本教程僅使用純SQL)

構建成功,啟動失敗

構建圖像時,需要花費大量時間來加載數據,這正是我想要的

2019-08-07 07:57:04.149 UTC [49] LOG:  database system was shut down at 2019-08-07 07:57:03 UTC
2019-08-07 07:57:04.231 UTC [48] LOG:  database system is ready to accept connections
 done
server started

./db-setup.sh: running methodinv_pcp3.sql.gz
2019-08-07 08:49:52.052 UTC [117] ERROR:  canceling autovacuum task
2019-08-07 08:49:52.052 UTC [117] CONTEXT:  automatic analyze of table "postgres.public.ftt_interactive_data_492"
2019-08-07 08:49:59.086 UTC [118] ERROR:  canceling autovacuum task
2019-08-07 08:49:59.086 UTC [118] CONTEXT:  automatic analyze of table "postgres.public.ftt_oper_492"
2019-08-07 08:50:34.086 UTC [118] ERROR:  canceling autovacuum task
2019-08-07 08:50:34.086 UTC [118] CONTEXT:  automatic analyze of table "postgres.public.ftt_validation_492"
2019-08-07 08:51:11.889 UTC [119] ERROR:  canceling autovacuum task
2019-08-07 08:51:11.889 UTC [119] CONTEXT:  automatic analyze of table "postgres.public.ftt_oper_492"
2019-08-07 08:54:21.131 UTC [123] ERROR:  canceling autovacuum task
2019-08-07 08:54:21.131 UTC [123] CONTEXT:  automatic analyze of table "postgres.public.ftt_oper_492"


waiting for server to shut down...2019-08-07 08:54:28.652 UTC [48] LOG:  received fast shutdown request
.2019-08-07 08:54:28.797 UTC [48] LOG:  aborting any active transactions
2019-08-07 08:54:28.799 UTC [48] LOG:  worker process: logical replication launcher (PID 55) exited with exit code 1
2019-08-07 08:54:28.800 UTC [50] LOG:  shutting down
..2019-08-07 08:54:31.407 UTC [48] LOG:  database system is shut down
 done

當我使用docker run運行映像時,啟動失敗,因為它找不到Postgres配置

D:\IdeaProjects\pcp\ftt-containers\ftt-db-method>docker run -p 5432:5432 -l ftt-db-method ftt-db-method:latest
Restoring /var/lib/postgresql/data ...
Done.
Launching command: postgres ...
postgres: could not access the server configuration file "/var/lib/postgresql/data/postgresql.conf": No such file or directory

最初,我的Dockerfile公開了VOLUME ,現在已注釋掉。 當我聲明一個卷(這並不是我真正想要的,我是Docker的新手,並有第一次機會復制並粘貼)時,以及在我注釋掉該卷時,都將發生以上輸出。

我正在嘗試加載大量數據的Postgres Docker鏡像有什么問題? 如何使用已經完整的數據庫有效地啟動Postgres,而該數據庫在容器重新啟動后將不會 (必要)生存?


編輯1

通過對容器進行重bash ,我發現在構建期間創建的數據轉儲為10K,因此基本上為空。

這還不能解決我的問題,但是可以回答為什么Postgres無法找到其心愛的數據目錄


編輯2

我能夠猛撲到一個臨時容器中,尤其是在還原數據庫和打包數據庫之間。

基本上Dockerfile可以

RUN ./db-setup.sh

哪個執行sql的還原

echo "$0: running $f"; gunzip -c "$f" | "${psql[@]}" > /dev/null 2>&1 ; echo ;;

輸出保存到臨時容器中。 現在Dockerfile可以

RUN ./db-pack.sh

哪個tar /var/lib/postgresql/data放入/zdata 我有

2019-08-07 16:43:51.532 UTC [42] LOG:  received fast shutdown request
waiting for server to shut down....2019-08-07 16:43:51.676 UTC [42] LOG:  aborting any active transactions
2019-08-07 16:43:51.679 UTC [42] LOG:  worker process: logical replication launcher (PID 49) exited with exit code 1
2019-08-07 16:43:51.681 UTC [44] LOG:  shutting down
...2019-08-07 16:43:54.952 UTC [42] LOG:  database system is shut down
 done
server stopped
Removing intermediate container 8dbe2a4e776a
 ---> 263896b905ce
Step 15/19 : RUN ./db-pack.sh
 ---> Running in 56132ecb90cc
Packing data folder:  /var/lib/postgresql/data
Pack & clean finished successfully.
Removing intermediate container 56132ecb90cc
 ---> 1a7f8d68e8df
Step 16/19 : VOLUME $PGDATA
 ---> Running in 10d222beed81
Removing intermediate container 10d222beed81
 ---> e1a9355882d1

因此,我將263896b905ce (如果您在PC上復制,則標記為263896b905ce標記為一個新映像,然后對其執行bash。 數據目錄為 ,腳本將不打包任何內容

docker tag 263896b905ce examine
docker run -it --entrypoint /bin/bash examine


root@ab963ace16a1:/opt/setup# ls
data-scripts.d  db-pack.sh  db-run.sh  db-setup.sh
root@ab963ace16a1:/opt/setup# cd /zdata/
root@ab963ace16a1:/zdata# ls
root@ab963ace16a1:/zdata# cd /var/lib/postgresql/
root@ab963ace16a1:/var/lib/postgresql# ls
data
root@ab963ace16a1:/var/lib/postgresql# cd data/
root@ab963ace16a1:/var/lib/postgresql/data# ls
root@ab963ace16a1:/var/lib/postgresql/data# ls -lah
total 8.0K
drwxrwxrwx 2 postgres postgres 4.0K Jul 17 23:55 .
drwxr-xr-x 1 postgres postgres 4.0K Jul 17 23:55 ..
root@ab963ace16a1:/var/lib/postgresql/data#
root@ab963ace16a1:/var/lib/postgresql/data# ls^C
root@ab963ace16a1:/var/lib/postgresql/data# exit
exit

固定

根據https://stackoverflow.com/a/52762779/471213

“ VOLUME為什么不起作用?” 在Dockerfile中定義VOLUME時,只能定義目標,而不能定義卷的源。 在構建期間,您將僅從中獲得一個匿名卷。 該匿名卷將在每個RUN命令處掛載,並預先填充映像的內容,然后在RUN命令末尾丟棄。 僅保存對容器所做的更改,不保存對體積的更改。

所以我基本上必須同時運行兩個RUN

RUN ./db-setup.sh && ./db-pack.sh
#RUN ./db-pack.sh

暫無
暫無

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

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