在Dockerfile中运行SQL脚本

我正在使用下一个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 

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

那么我怎么能直接在Dockerfile中运行SQL脚本?

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

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

如果您希望在从此映像派生的映像中执行额外的初始化操作,请在/docker-entrypoint-initdb.d下添加一个或多个* .sql,* .sql.gz或* .sh脚本(必要时创build该目录)。 在入口点调用initdb创build默认的postgres用户和数据库之后,它将运行任何* .sql文件,并在该目录中find任何* .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命令只是一个例子。

======================== Correct Answer End ======================= =

留给后人的原始答案:

你可以使用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 

你应该find如何从bash中运行PostgreSQL的SQL Query,然后在你的Dockerfile中添加一条RUN指令。