我试图摆脱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文件夹中是一个执行填充的外壳脚本
#!/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镜像,并将其上传到注册表。
发布于 2021-10-27 14:38:31
理论上,你可以在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,而且我不是postgres专家,也不会说德语,所以我不能立即解决。
这部分还安装了sudo并将新的dbuser添加到sudo组中,因为postgress不想从根目录开始,所以postgres从dbuser运行。
希望本文能帮助您朝着正确的方向前进:)
https://stackoverflow.com/questions/69739501
复制相似问题