创建自定义docker postgresql映像并修改它';s入口点
我正在尝试从创建自定义docker postgresql映像并修改它';s入口点,docker,dockerfile,Docker,Dockerfile,我正在尝试从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
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 run-d--name=pg docker-p 5433:5432-e POSTGRES\u USER=POSTGRES-e POSTGRES\u PASSWORD=s123 safagres
及货柜清单:
PS D:\Software\Windows\Docker\Images\AndroidService> 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:\Software\Windows\Docker\Images\AndroidService>
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
/usr/local/bin/docker-entrypoint.sh:running/docker-entrypoint-initdb.d/init.sql
2019-08-26 05:25:55.650 UTC[39]错误:字符88处的“psql”或其附近出现语法错误
2019-08-2605:25:55.650 UTC[39]声明:/*--psql-U posgtres-p 5432
psql-U-d-1-f.sql*/
psql-U posgtres-p 5432
创建数据库位置
拥有者=博士后
编码='UTF8'
LC_COLLATE='English_used.1252'
表空间=pg_默认值
连接限制=-1
模板模板0;
psql:/docker entrypoint initdb.d/init.sql:12:错误:“psql”处或附近的语法错误
第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
#/垃圾箱/垃圾箱
set-e
psql-v ON_ERROR_STOP=1--dbname template1--username postgres您是否尝试过$dbname
?--dbname
和--username
被替换为ENV dbname
和ENV username
@bellacknI将dockerfile中的COPY
命令替换为COPY init.sh/docker entrypoint initdb.d/
,并在我创建容器时使用您的代码,我得到了以下错误:服务器启动/usr/local/bin/docker-entrypoint.sh:running/docker-entrypoint-initdb.d/init.sh/usr/local/bin/docker-entrypoint.sh:/docker-entrypoint-initdb.d/init.sh:/bin/sh^M:错误的解释器:在Dockerfile中声明为ENV
的文件或目录,以后不能在入口点或容器中的任何其他位置使用$VARIABLE
检索。您得到的错误表明您的文件有CRLF行结尾,当它需要LF行结尾时,可能是因为您在Windows上。在构建映像之前,请尝试在文件上运行。
#!/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