自定义PostgreSQL,修改后的配置文件和存储在主机文件系统上的数据库文件?

时间:2018-04-06 20:11:47

标签: postgresql docker docker-compose

我想为PostgreSQL创建一个自定义Docker镜像,它将使用主机的文件系统来存储数据库文件。

我还需要调整此映像以覆盖默认的PGSQL配置,以便能够从任何IP访问数据库。这纯粹是为了开发环境,因此没有安全担忧或问题。

我知道如何使用本地文件系统,我知道如何将文件从主机添加到容器中。我不知道如何在同一个图像/容器中完成这两件事。

我尝试使用Dockerfile:

FROM postgres:9.6.8
RUN echo "host all  all  0.0.0.0/0  trust" >> /var/lib/postgresql/data/pg_hba.conf
RUN echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf

使用包含以下内容的撰写文件:

version: "2"
services:
 db:
   image: "test-pgsql:latest"
   environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgress
         - POSTGRES_DB=postgres
   ports:
         - "5433:5432"
   volumes:
         - /var/lib/postgresql/data:/var/lib/postgresql/data

这不起作用,我认为这是因为配置文件在图像内被修改,但整个PGSQL文件夹被组成文件中的卷屏蔽。

1 个答案:

答案 0 :(得分:2)

我认为你可以在不创建衍生图像的情况下做到这一点。

当postgres图像开始时,它会运行docker-entrypoint.sh(这是图像的一部分)。

此启动例程的一部分运行文件夹docker-entrypoint-initdb.d

中包含的所有脚本
for f in /docker-entrypoint-initdb.d/*; do
    case "$f" in
        *.sh)     echo "$0: running $f"; . "$f" ;;
        *.sql)    echo "$0: running $f"; "${psql[@]}" -f "$f"; echo ;;
        *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${psql[@]}"; echo ;;
        *)        echo "$0: ignoring $f" ;;
    esac
    echo
done

可以看出,它将盲目地运行此目录中的任何脚本,该脚本是.sh shell脚本或.sql / .sql.gz sql脚本。

综上所述,您可以在docker-compose.yml中将本地文件夹(包含名为startup.sh的shell脚本)映射到/docker-entrypoint-initdb.d

startup.sh (您可能需要添加警卫以防止重复附加到conf文件)

echo "host all  all  0.0.0.0/0  trust" >> /var/lib/postgresql/data/pg_hba.conf
echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf

<强> docker-compose.yml

db:
  image: postgres:9.6.8
  restart: always
  environment: 
    - SOMESTUFF=something
  ports:
    - "5433:5432"
  volumes:
    - /var/lib/postgresql/data:/var/lib/postgresql/data
    - ${PWD}/postgresdocker/dbscripts/:/docker-entrypoint-initdb.d