Tony Chou
Tony Chou

Reputation: 604

docker build error: psql: could not connect to server: Connection refused

My goal is to create an docker image(postgres) with its default data.

So my plan is to write a dockerfile, use base image postgres:11, then copy and run db0.sql inside it.

SQL Script: 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

But when I run docker build -t db0 -f db0.dockerfile ., it shows me the following error:

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

I'm not good at docker, but as I know, the error seems to tell me that

When I try to run psql command, but at this time, the postgres service is not ready for use?


For now, my final goal is just like do the following command in terminal:

  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

After doing these, I can connect into it with a python_team Database, a quiz schema in it with an example table, and a record in it.

How to solve that?

Upvotes: 3

Views: 2513

Answers (1)

Tony Chou
Tony Chou

Reputation: 604

I found the solution, follow this

dockerfile: db0.dockerfile

FROM postgres:11

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

official postgres image will run .sql scripts found inside /docker-entrypoint-initdb.d/

and then run docker run -d -p 5432:5432 -v /srv/docker_data/db0:/var/lib/postgresql/data/ -e POSTGRES_PASSWORD=postgres --name=db0 db0

Upvotes: 2

Related Questions