簡體   English   中英

Docker:無法從Dockerfile運行psql命令

[英]Docker: can't RUN psql commands from Dockerfile

我有一個Python / PostgreSQL項目,我試圖將其放入Docker容器中。 當我嘗試在容器內運行psql命令以在構建映像時創建用戶和數據庫時,我收到此錯誤:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

這是一個Dockerfile:

FROM python:2.7-slim

WORKDIR /app

ADD . /app

RUN apt-get update && apt-get install -y postgresql postgresql-contrib libgeos-c1

RUN service postgresql start

RUN su postgres bash -c "psql -c \"CREATE USER myuser WITH PASSWORD 'password';\"" \
   && su postgres bash -c "psql -c \"CREATE DATABASE db WITH OWNER = myuser;\""```

請注意,我甚至嘗試在psql命令之前啟動postgresql服務。

我嘗試了另一種方法,即使用基本圖像postgres:9.6.3並在其上安裝Python pip。 我仍然得到同樣的錯誤。 這是第二個Dockerfile供參考:

FROM postgres:9.6.3

WORKDIR /app

ADD . /app

RUN apt-get update && apt-get install -y python-pip libgeos-c1

RUN service postgresql start

RUN su postgres bash -c "psql -c \"CREATE USER myuser WITH PASSWORD 'password';\"" \
   && su postgres bash -c "psql -c \"CREATE DATABASE db WITH OWNER = myuser;\""

懺悔:我是一個碼頭工人。

這與Dockerfile中的多RUN與單鏈RUN有關,哪個更好?

我也遇到了一個碼頭工作人員。 每個RUN可能不在相同的“上下文”中。 請參閱此輸出,請注意start命令和psql命令的容器不同。 似乎它在構建圖像時構建容器的快照。

Step 25/30 : RUN service postgresql start
 ---> Running in 5c22e985359c
Starting PostgreSQL 9.6 database server: main.
Removing intermediate container 5c22e985359c
 ---> db1f2c2cdb33
Step 26/30 : USER postgres
 ---> Running in 6d56501e7286
Removing intermediate container 6d56501e7286
 ---> b35d3912eacf
Step 27/30 : RUN psql -c "CREATE USER user with password 'password'"
 ---> Running in 8c9130d2daa5
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain 

我使用以下命令將這些命令鏈接在一起

RUN service postgresql start &&\
  sudo -u postgres psql -c "CREATE USER user with password 'password'"

成功創建CREATE USER命令的結果,如果需要,應該能夠繼續進一步使用&& \\

Step 23/23 : RUN service postgresql start &&  sudo -u postgres psql -c "CREATE USER user with password 'password'"
 ---> Running in f234f6074f56
Starting PostgreSQL 9.6 database server: main.
CREATE ROLE

最好在docker-entrypoint-initdb.d使用腳本。 Dockerfile

COPY ./init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh

腳本本身:

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

EOSQL

更多細節: https//docs.docker.com/samples/library/postgres/#how-to-extend-this-image

暫無
暫無

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

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