首页 > 解决方案 > Postgres Docker 在 docker build 上导入 SQL 转储

问题描述

我正在尝试摆脱 Docker-In-Docker,因此我正在用新的图像替换我们的 Postgres 图像。对于一个用例,我们使用预填充的 Postgres 图像。旧的工作流程是构建镜像,将其拉入管道并使用 Docker-In-Docker 填充数据,然后再次将其重新上传到镜像注册表。

新方法是使用 docker 创建 Postgres 映像,我已将.sql转储文件复制到/docker-entrypoint-initdb.d/. 但这会在启动后填充图像,我想在容器注册表中有一个预填充的图像,因为填充最多需要 2 分钟。

这是我的 Dockerfile:

FROM postgres:11.12

LABEL maintainer="Hello Stackoverflow"

ARG POSTGRES_VERSION="11.12"
ARG TZ="Europe/Berlin"

ENV TZ ${TZ}
ENV LANG de_DE.UTF-8
ENV LANGUAGE de_DE.UTF-8
ENV LC_ALL de_DE.UTF-8
ENV POSTGRES_PASSWORD 'blabla'
ENV POSTGRES_HOST_AUTH_METHOD trust

RUN set -x && \
    localedef -i de_DE -c -f UTF-8 -A /usr/share/locale/locale.alias de_DE.UTF-8


COPY test-data/. /docker-entrypoint-initdb.d/

CMD ["postgres"]

test-data文件夹中是一个执行填充的 shell 脚本

#!/bin/sh
cd /docker-entrypoint-initdb.d
echo "read one.sql"
psql -v ON_ERROR_STOP=1 -U postgres  < sql/one.sql
echo "read two.sql"
...
...
...

所以想法是用模式预填充 Postgres docker 映像并上传到注册表。

标签: databasepostgresqldockercontinuous-integrationdevops

解决方案


理论上,您可以在 docker build 期间运行 postgres 引擎并执行您需要的任何内容,这里不是完全有效的示例,即 postgres 无法启动,因为没有配置文件。

如果你在这上面花更多的时间,我敢打赌它应该可以解决问题。

在你的行之间COPY test-data/. /docker-entrypoint-initdb.d/插入CMD ["postgres"]这个

RUN adduser --disabled-password --gecos "" dbuser
RUN apt-get update
RUN apt-get install -y sudo
RUN echo "dbuser ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/dbuser && chmod 0440 /etc/sudoers.d/dbuser

USER dbuser:dbuser

RUN sudo chown -R dbuser:dbuser /docker-entrypoint-initdb.d
RUN sudo chown -R dbuser:dbuser /var/lib/postgresql/

RUN postgres

WORKDIR /docker-entrypoint-initdb.d

RUN psql -v ON_ERROR_STOP=1 -U postgres  < sql/one.sql

目前失败- 无法在德语RUN postgres上找到配置,而且我不是 postgres 专家,也不会说德语,所以我无法立即解决。

这部分还安装了 sudo 并将新的添加dbuser到 sudo 组中,因为 postgress 不想从 root 开始,所以 postgres 从 dbuser 运行。

希望这将帮助您朝着正确的方向前进:)


推荐阅读