创建自定义 docker postgresql 镜像并修改其入口点



我正在尝试从postgres:11.5-alpine创建自定义映像,所以我制作了这个dockerfile:

FROM postgres:11.5-alpine
LABEL MAINTAINER groot
ENV LANG en_US.utf8
ENV DBNAME pglocations
ENV USERNAME postgres
COPY init.sql /docker-entrypoint-initdb.d/

这是 init.sql 文件:

/*--psql -U posgtres -p 5432
psql -U <username> -d <dbname> -1 -f <filename>.sql*/
psql -U posgtres -p 5432
CREATE DATABASE pglocations
WITH OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'English_United States.1252'
TABLESPACE = pg_default
CONNECTION LIMIT = -1
TEMPLATE template0;
/*psql -U posgtres -d pglocations -1 -f pglocations.sql*/

我通过以下命令制作图像:docker build -t safagress:11.5 .这是图像列表:

PS D:SoftwareWindowsDockerImagesAndroidService> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
safagress           11.5                26d34fa7c2c1        About an hour ago   71.9MB
postgres            11.5-alpine         78b21f6420c0        5 days ago          71.9MB
alpine              latest              961769676411        5 days ago          5.58MB
dpage/pgadmin4      latest              489972d75226        6 days ago          248MB

并制作容器:

docker run -d --name=pg-docker -p 5433:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=s123 safagres

和集装箱清单:

PS D:SoftwareWindowsDockerImagesAndroidService> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                             NAMES
e4a6bdf49312        safagress:11.5      "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:5433->5432/tcp            pg-docker
3de509771297        dpage/pgadmin4      "/entrypoint.sh"         2 hours ago         Up 2 hours          443/tcp, 127.0.0.1:8081->80/tcp   priceless_black
PS D:SoftwareWindowsDockerImagesAndroidService>

1-当我创建容器时,我收到此错误:

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
2019-08-26 05:25:55.650 UTC [39] ERROR:  syntax error at or near "psql" at character 88
2019-08-26 05:25:55.650 UTC [39] STATEMENT:  /*--psql -U posgtres -p 5432
psql -U <username> -d <dbname> -1 -f <filename>.sql*/
psql -U posgtres -p 5432
CREATE DATABASE pglocations
WITH OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'English_United States.1252'
TABLESPACE = pg_default
CONNECTION LIMIT = -1
TEMPLATE template0;
psql:/docker-entrypoint-initdb.d/init.sql:12: ERROR:  syntax error at or near "psql"
LINE 4: psql -U posgtres -p 5432

2-例如,如何将ENV DBNAME pglocations从dockerfile传递到init.sql以使用它的值?

这里的问题是您在 SQL 文件中使用 shell 命令 (psql -U ...),当图像的入口点尝试运行它时会导致语法错误。

尝试将这样的文件放在 initdb.d 文件夹中,并将其命名为 init.sh:

#!/bin/sh
set -e
psql -v ON_ERROR_STOP=1 --dbname template1 --username postgres <<-EOSQL
CREATE DATABASE "$DBNAME"
WITH OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'English_United States.1252'
TABLESPACE = pg_default
CONNECTION LIMIT = -1
TEMPLATE template0;
EOSQL

除此之外,有关如何使用 Postgres Docker 镜像(及其环境变量)的良好说明可以在其 DockerHub 站点上找到。

最新更新