【问题标题】:Postgres Docker importing SQL dump on docker buildPostgres Docker 在 docker build 上导入 SQL 转储
【发布时间】:2021-12-12 19:04:23
【问题描述】:

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

新方法是使用 docker 创建 Postgres 映像,我已将 .sql Dumps 复制到 /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 映像并上传到注册表。

【问题讨论】:

  • 我相信,如果您有一个标准的 postgres 映像,以及另一个带有数据的 docker 连接到它并使用您需要的任何数据加载它,那么您将需要更少的杂技。分开关注点。
  • 您还可以在命名卷或主机目录中备份和恢复数据目录,而不是尝试在映像中传输数据。

标签: database postgresql docker continuous-integration devops


【解决方案1】:

理论上,您可以在 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 专家,也不会说德语,所以我无法立即解决。 p>

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

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

【讨论】:

  • 谢谢,但这仍然无法使用 ENG。我收到消息postgres: could not access the server configuration file "/var/lib/postgresql/data/postgresql.conf": No such file or directory 有什么想法吗?好像文件还没有,可能在第一次启动后
  • postgres 不知道这是 docker build 还是 docker 容器正在运行。它只是无法知道当前阶段,因此应该完全可以在构建期间运行它。应该有 postgres init 命令之类的地方。
猜你喜欢
  • 1970-01-01
  • 2016-10-16
  • 2022-01-24
  • 1970-01-01
  • 2016-08-15
  • 2020-02-20
  • 2017-06-27
  • 2016-08-05
  • 1970-01-01
相关资源
最近更新 更多