database - 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 映像并上传到注册表。
解决方案
理论上,您可以在 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 运行。
希望这将帮助您朝着正确的方向前进:)
推荐阅读
- laravel - 身份验证 - 在会话和基于令牌的身份验证之间共享相同的经过身份验证的用户
- reactjs - 将 react router v4 与 react 16.5.2 一起使用,在加载时收到警告并使用路由器
- .net - 从 .Net 应用程序登录到 Logstash 的最佳做法是什么?
- javascript - 在 Route 中反应上下文
- bash - 在bash中解析具有多个多字的参数
- python - Pyodbc MSSQL 数据库备份 unicode 问题
- java - finishAffinity 不会终止异步任务
- python - 如何在调用 AWS Lambda 函数期间在有效负载中传递字节数据
- java - Viewpager 在空对象引用上设置适配器
- android - 无法在项目的以下配置之间进行选择:instant: - kapt - kaptDebug - kaptRelease