【发布时间】: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