[英]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.