在 Dockerfile 中运行 SQL 脚本

mib*_*iti 8 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
Run Code Online (Sandbox Code Playgroud)

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

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

Was*_*hif 5

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

根据 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
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
    CREATE ROLE read_only;
EOSQL
Run Code Online (Sandbox Code Playgroud)

请注意,我不是 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
Run Code Online (Sandbox Code Playgroud)

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