在Dockerfile

时间:2017-09-14 08:19:17

标签: docker dockerfile

我正在使用下一个Dockerfile来设置postgres数据库引擎

FROM postgres:9.6.5
ENV POSTGRES_USER postgres
ENV POSTGRES_PASSWORD xxx
ENV POSTGRES_DB postgres
ADD localDump.sql /docker-entrypoint-initdb.d

我需要在初始化数据库之前和运行localDump.sql脚本之前创建ROLE CREATE ROLE read_only;

那么如何直接在Dockerfile中运行SQL脚本呢?

1 个答案:

答案 0 :(得分:3)

======================== 正确答案开始 ============= ===========

根据Postgres图像文档,您可以通过运行脚本或SQL文件来扩展原始图像。

  

如果您想在从这个派生的图像中进行其他初始化,请在/docker-entrypoint-initdb.d下添加一个或多个* .sql,* .sql.gz或* .sh脚本(创建目录,如有必要)。在入口点调用initdb创建默认的postgres用户和数据库之后,它将运行任何* .sql文件,并在该目录中找到任何* .sh脚本,以便在启动服务之前进行进一步的初始化。

对于你的Dockerfile,你可以这样做。

FROM postgres:9.6.5

ENV POSTGRES_USER postgres
ENV POSTGRES_PASSWORD xxx
ENV POSTGRES_DB postgres

ADD create-role.sh /docker-entrypoint-initdb.d
ADD localDump.sql /docker-entrypoint-initdb.d

您还需要create-role.sh脚本来执行plsql命令

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
    CREATE ROLE read_only;
EOSQL

请注意,我不是SQL DBA,plsql命令只是一个例子。

======================== 正确答案结束 ============= ===========

为后代留下的原始答案:

您可以使用psql吗?这样的事情。

FROM postgres:9.6.5

ENV POSTGRES_USER postgres
ENV POSTGRES_PASSWORD xxx
ENV POSTGRES_DB postgres

RUN psql -U postgres -d database_name -c "SQL_QUERY"

ADD localDump.sql /docker-entrypoint-initdb.d

您应该找到如何从bash运行Postgres的SQL查询,然后在Dockerfile中添加RUN指令。