首页 > 解决方案 > docker build 错误:psql:无法连接到服务器:连接被拒绝

问题描述

我的目标是使用其默认数据创建一个 docker 映像(postgres)。

所以我的计划是写一个 dockerfile,使用 base image postgres:11,然后复制并在db0.sql里面运行。

SQL 脚本:db0.sql

CREATE TABLE "quiz"."example" (
  "name" varchar(255),
  "age" int4,
  "phone" varchar(255),
  "blood_group" varchar(255),
  "height" int4
);

INSERT INTO "quiz"."example" VALUES ('Tony', NULL, NULL, 'O', 180);
ALTER TABLE "quiz"."example" ADD CONSTRAINT "name" UNIQUE ("name");

dockerfile:db0.dockerfile

FROM postgres:11
COPY db0.sql /srv/
RUN /etc/init.d/postgresql start
RUN su postgres
EXPOSE 5432
RUN psql -U postgres -p 5432 -h localhost -f /srv/db0.sql

但是当我运行时docker build -t db0 -f db0.dockerfile .,它向我显示以下错误:

Sending build context to Docker daemon  4.096kB
Step 1/6 : FROM postgres:11
 ---> 55ff21ffc6d1
Step 2/6 : COPY db0.sql /srv/
 ---> Using cache
 ---> 5623b274bfef
Step 3/6 : RUN /etc/init.d/postgresql start
 ---> Using cache
 ---> 838cd16f9545
Step 4/6 : RUN su postgres
 ---> Using cache
 ---> 2c65f67991f0
Step 5/6 : EXPOSE 5432
 ---> Using cache
 ---> a7921ebdf180
Step 6/6 : RUN psql -U postgres -p 5432 -h localhost -f /srv/db0.sql
 ---> Running in ddaced269112
psql: could not connect to server: Connection refused
        Is the server running on host "localhost" (127.0.0.1) and accepting
        TCP/IP connections on port 5432?
could not connect to server: Network is unreachable
        Is the server running on host "localhost" (::1) and accepting
        TCP/IP connections on port 5432?
The command '/bin/sh -c psql -U postgres -p 5432 -h localhost -f /srv/db0.sql' returned a non-zero code: 2

我不擅长 docker,但据我所知,错误似乎告诉我

当我尝试运行psql命令时,但此时,postgres 服务还没有准备好使用?


现在,我的最终目标就像在终端中执行以下命令一样:

  1. docker run -d -p 5432:5432 -v /srv/docker_data/db0:/var/lib/postgresql/data/ -e POSTGRES_PASSWORD=postgres --name=db0 --restart=always postgres:11
  2. docker cp db0.sql db0:/srv/
  3. docker exec -it db0 bash
  4. su postgres
  5. psql -U postgres -p 5432 -h localhost -f /srv/db0.sql

完成这些之后,我可以使用 python_team 数据库、其中包含示例表的测验模式和其中的记录来连接到它。

如何解决?

标签: postgresqldockerdockerfile

解决方案


我找到了解决方案,按照这个

dockerfile:db0.dockerfile

FROM postgres:11

ENV POSTGRES_PASSWORD postgres
COPY db0.sql /docker-entrypoint-initdb.d/

官方 postgres 图像将运行内部找到的.sql脚本/docker-entrypoint-initdb.d/

然后运行docker run -d -p 5432:5432 -v /srv/docker_data/db0:/var/lib/postgresql/data/ -e POSTGRES_PASSWORD=postgres --name=db0 db0


推荐阅读