iT邦幫忙

0

執行docker pg_dump出現的問題

在linux環境下
我在執行.sh的檔案中的
docker exec -it -u $USERID -e PGPASSWORD=docker $PG_CONTAINER pg_dump -v -x -U docker -h 127.0.0.1 gis -f /tmp/work/gis.backup -F c
程式時,出現

pg_dump: error: could not open output file "/tmp/work/gis.backup": Permission denied

有人有辦法解決嗎?

石頭 iT邦高手 1 級 ‧ 2021-07-28 17:14:46 檢舉
權限不夠 Permission denied

1 個回答

2
raytracy
iT邦大神 1 級 ‧ 2021-07-29 00:07:56
最佳解答

你的 Container 在跑的時候, 沒有給 /tmp/work 外部寫入的權限...
要看你當初跑 Conainer 的指令才知道問題在何處....如果你不知道的話, 請用:

docker inspect $PG_CONTAINER

看一下原本給了甚麼參數?
或者請當初建這個 Container 的人, 給妳正確的 docker run 參數...

看更多先前的回應...收起先前的回應...
jbuduoo iT邦新手 5 級 ‧ 2021-07-29 08:58:06 檢舉

這是$PG_CONTAINER的參數,但還是不會看。
https://hackmd.io/@Y00YB1ZGRJaUT9hlzSidIw/r13e6dJ1K

jbuduoo iT邦新手 5 級 ‧ 2021-07-29 09:45:15 檢舉

暫時開啟/關閉SELinux,就可以用了。

setenforce 0 -->關閉

raytracy iT邦大神 1 級 ‧ 2021-07-29 12:24:16 檢舉

雖然你自己解掉了, 但這邊還是說明一下...

關掉 SELinux 並不是好的解法, 他只是讓你暫時閃過去, 但在關掉的期間, 整個 OS 都暴露在沒有 SELinux 保護的較高風險之中, 變成要由你扛起系統被駭的責任...

正確的做法, 應該是要遵循 SELinux 的規則, 而不是關掉它, 但將其修改為符合你 Container 環境所需. 假設你是跑 CentOS/RHEL 7 以上的版本, 照理說, SELinux 裡面已經預含可以允許 container 做 bind mount 的規則, 只需要將她打開就可以...

比對您上面所貼的 inspect 內容可以發現, 主要被 SELinux 擋到的 bind mound 是這條:

{
“Type”: “bind”,
“Source”: “/opt/osm-styles/imposm/work”,
“Destination”: “/tmp/work”,
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
},

在 OS 層級的 /opt/osm-styles/imposm/work 因為受到 SELinux 保護, 會拒絕未經許可的寫入. 其實, 你只需要在啟動 Container 的時候, 在 -v 後面加上 :Z 參數告知有 SELinux, 他就會自動解決這個問題. 例如:

-v /opt/osm-styles/imposm/work:/tmp/work:Z

這樣就不需要將整個 SELinux 關閉..

相關討論:
https://gist.github.com/jamesluberda/537af7f2144dc4440ab5f45f8ef9ab82

jbuduoo iT邦新手 5 級 ‧ 2021-07-29 14:42:54 檢舉

我現在在用linux 使用docker,可否請大神推薦入門的網路資料,給我當書單。
不然我現在使用這個工具似乎東摸一塊,西摸一塊。
覺得自已空空的。

raytracy iT邦大神 1 級 ‧ 2021-07-29 22:25:31 檢舉

原廠的文件寫得還不錯, 全部看完應該有概念:
https://docs.docker.com/
然後多看國外論壇裡面的討論, 如: StackOverflow...

我要發表回答

立即登入回答