Postgres Docker在Docker构建中导入SQL转储



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

新的方法是用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"
...
...
...

所以我们的想法是用schema预先填充Postgres docker映像并上传到注册表。

理论上,你可以在docker构建期间运行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运行。

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

相关内容

  • 没有找到相关文章

最新更新