[英]Dockerized Postgresql cannot access postgresql.conf on custom image
我正在嘗試/調試/學習/破解Docker。 我目前正在編寫Docker代碼以為我的應用程序創建快照測試環境。
通過snapshotted
我的意思是每次重啟時都會有意重置數據庫,以便可以在特定時間使用舊數據 。 在我的情況下,特有的是我想在構建時而不是在啟動時填充Postgresql數據庫。 Postgresql映像已准備就緒,可以在容器啟動時使用sql腳本填充db,但是需要花費幾個小時。
我的應用程序是由運行我的WAR的Tomcat 8.5服務器和一個Postgresql數據庫組成的,這是我現在問題的重點。 在編寫完整代碼時,我正在創建一個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,而該數據庫在容器重新啟動后將不會 (必要)生存?
通過對容器進行重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.