创建自定义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