我正在尝试从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 站点上找到。