這與Error While Attempting to docker-compose a Postgres Image有關。
除了上述問題中描述的檔案外,init.sh如下所示:
#for line in $(cat .env); do
# export $line;
#done
#service postgresql-9.3 initdb
psql -d users -U even_financial -f schemas.sql
schemas.sql看起來像這樣:
CREATE TABLE accounts (
user_id serial PRIMARY KEY,
username VARCHAR ( 50 ) UNIQUE NOT NULL,
password VARCHAR ( 50 ) NOT NULL,
email VARCHAR ( 255 ) UNIQUE NOT NULL,
created_on TIMESTAMP NOT NULL,
last_login TIMESTAMP
);
如果我init.sh從 docker 容器內部執行,postgres 會正確填充。
我如何從我的Dockerfile/做同樣的事情docker-compose?
我的docker-compose樣子是這樣的:
version: "3.9"
services:
postgres:
build:
docker/postgres
ports:
- "5432:5432"
env_file:
docker/postgres/.env
# command:
# - /bin/chmod x /app/init.sh
# - . /app/init.sh
我的docker/postgres/Dockerfile樣子是這樣的:
FROM postgres:14.5-alpine
WORKDIR /app
COPY schemas.sql .
COPY init.sh .
COPY .env .
#RUN . init.sh
嘗試init.sh從commandsin docker-compose(如上)運行會導致:
/usr/local/bin/docker-entrypoint.sh: line 341: /bin/chmod x /app/init.sh: No such file or directory
嘗試通過自身運行init.sh會Dockerfile導致RUN:
=> ERROR [6/6] RUN . init.sh 0.2s
------
> [6/6] RUN . init.sh:
#0 0.144 psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
#0 0.144 Is the server running locally and accepting connections on that socket?
------
failed to solve: executor failed running [/bin/sh -c . init.sh]: exit code: 2
`docker-compose` process finished with exit code 17
uj5u.com熱心網友回復:
可以通過將 shell 和/或 sql 腳本放入以下位置來擴展官方Postgres 映像/docker-entrypoint-initdb.d:
如果您想在從該鏡像派生的鏡像中進行額外的初始化,請在 /docker-entrypoint-initdb.d 下添加一個或多個 *.sql、*.sql.gz 或 *.sh 腳本(必要時創建目錄)。在入口點呼叫 initdb 創建默認的 postgres 用戶和資料庫后,它將運行任何 *.sql 檔案,運行任何可執行的 *.sh 腳本,并在該目錄中找到任何不可執行的 *.sh 腳本以在之前進行進一步初始化啟動服務。
警告:/docker-entrypoint-initdb.d 中的腳本僅在您使用空資料目錄啟動容器時運行;任何預先存在的資料庫都將在容器啟動時保持不變。一個常見問題是,如果您的 /docker-entrypoint-initdb.d 腳本之一失敗(這將導致入口點腳本退出)并且您的協調器使用已初始化的資料目錄重新啟動容器,它將不會繼續使用您的腳本.
您可以將這些腳本構建到自定義映像中,也可以在運行時通過系結掛載來掛載它們。例如,如果您的schemas.sql腳本位于本地目錄名稱docker/postgres/init中,則可以使用以下內容docker-compose.yaml:
version: "3.9"
services:
postgres:
image: docker.io/postgres:14
ports:
- "5432:5432"
env_file:
docker/postgres/.env
volumes:
- ./docker/postgres/init:/docker-entrypoint-initdb.d
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/514701.html
標籤:PostgreSQL码头工人码头工人撰写dockerfile
上一篇:使用該行在PostgreSQL中重復的??次數來獲取最后一個重復行?
下一篇:函式date_trunc不存在
