Docker for Postgresql数据库与数据导入

vvppvyoh  于 12个月前  发布在  Docker
关注(0)|答案(2)|浏览(132)

我正在尝试为PostgreSQL数据库创建一个Docker,并导入一些数据到其中。我已经遵循了官方文档。
Dockerfile看起来像这样:

FROM postgres:14.10

#Set env vars
ENV PGDATA=/var/pgdata
ENV POSTGRES_USER=postgres
ENV POSTGRES_PASSWORD=admin
ENV POSTGRES_HOST_AUTH_METHOD=trust

# Copy backup to container
COPY opr.dump /opr.dump
COPY entrypoint2.sh /docker-entrypoint-initdb.d/entrypoint2.sh

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]

字符串
入口点脚本看起来像这样:

#!/bin/bash
set -e

# Create the Postgres database 
createdb opr 

# Extract the schema and data from the backup file
pg_restore -U postgres -d opr /opr.dump


一切正常,但导入数据后,容器停止,无论是在附加和分离模式。我复制了从官方形象的入口点和CMD,但没有成功。
我应该提到的是,我也尝试过不复制ENTRYPOINT和CMD,容器仍然停止。
我的问题是如何让容器在导入数据后不停止?

mwyxok5s

mwyxok5s1#

您只需要将entrypoint2.sh脚本复制到docker-entrypoint-initdb.d目录中,就像the documentation一样(请参阅脚本一节)
如果您想在从此映像派生的映像中执行其他初始化,请在/docker-entrypoint-initdb.d [...]下添加一个或多个 .sql、.sql.gz或 *.sh脚本,它将运行任何可执行的 *.sh脚本,并获取该目录中找到的任何不可执行的 *.sh脚本,以便在启动服务之前执行进一步的初始化。
因此,无需覆盖ENTRYPOINTCMD
编辑:看起来你将不得不这样做后,容器开始,就像大卫迷宫指出。

wwtsj6pe

wwtsj6pe2#

最后,我成功地创建了一个自定义的入口点脚本来完成这个任务。
Dockerfile看起来像这样:

FROM postgres:14.10

#Set env vars
ENV PGDATA=/var/pgdata
ENV POSTGRES_USER=postgres
ENV POSTGRES_PASSWORD=admin
ENV POSTGRES_HOST_AUTH_METHOD=trust

# Create a directory to store PostgreSQL data and logs
RUN mkdir -p ${PGDATA} /tmp /var/log/postgresql && chown -R postgres:postgres ${PGDATA} /tmp /var/log/postgresql

WORKDIR /data

# Expose the PostgreSQL port
EXPOSE 5432

# Copy the entrypoint script to the container
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Copy backup to container
COPY opr.dump /opr.dump

# Set the user to run the container
USER postgres

# Run the entrypoint script
CMD ["/entrypoint.sh"]

字符串
入口点脚本看起来像这样:

#!/bin/bash

# Initialize the PostgreSQL data directory
initdb -D ${PGDATA}

#change hba_conf
echo "host all all all trust" >> /var/pgdata/pg_hba.conf

# Start PostgreSQL in the background
pg_ctl -D ${PGDATA} -l /var/log/postgresql/logfile start

# Wait for PostgreSQL to start
wait_postgresql() {
  while ! pg_isready -q; do
    echo "Waiting for PostgreSQL to start..."
    sleep 1
  done
}
wait_postgresql

# Create the Postgres database 
createdb opr 

# Extract the schema and data from the backup file
pg_restore -U postgres -d opr /opr.dump

# Keep PostgreSQL running
tail -f /var/log/postgresql/logfile

相关问题