【问题标题】:Customize the configuration of the official PostgreSQL docker image自定义PostgreSQL官方docker镜像的配置
【发布时间】:2016-03-27 14:49:32
【问题描述】:

我使用的是官方的 postgresql docker 镜像(9.4 版)。我已经扩展了 Dockerfile,所以我可以使用 bash 脚本更改 postgresql.conf 等中的设置。 它成功地为单个 sed 命令添加并在入口点运行脚本。但是当我输入 2 个或更多 sed 命令时,我收到以下错误:

/docker-entrypoint.sh:运行 /docker-entrypoint-initdb.d/config.sh
: 没有这样的文件或目录读取 /var/lib/postgresql/data/postgresql.conf

我正在尝试在 Windows 10 上结合 Vagrant 和 VirtualBox,通过 vagrant-winnfsd 插件在共享文件夹上使用 NFS 文件系统。

为什么会这样?如何更改我的 bash 脚本以使用更多配置设置?有没有更好的办法?

Docker 文件:

FROM postgres:9.4

RUN echo "Europe/Athens" > /etc/timezone \
 && dpkg-reconfigure -f noninteractive tzdata

RUN localedef -i el_GR -c -f UTF-8 -A /usr/share/locale/locale.alias el_GR.UTF-8

ADD config.sh /docker-entrypoint-initdb.d/
RUN chmod 755 /docker-entrypoint-initdb.d/config.sh

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

config.sh:

#!/bin/bash
sed -i -e"s/^#logging_collector = off.*$/logging_collector = on/" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf

数据库.yml

postgres:
    container_name: postgres-9.4
    image: ***/postgres-9.4
    volumes_from:
      - postgres_data
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=database
      - USERMAP_UID=999
      - USERMAP_GID=999

postgres_data:
    container_name: postgres_data
    image: ***/postgres-9.4
    volumes:
      - ./services/postgres:/etc/postgresql
      - ./services/postgres:/var/lib/postgresql
      - ./services/postgres/logs:/var/log/postgresql
    command: "true"

【问题讨论】:

标签: postgresql docker docker-compose dockerfile postgresql-9.4


【解决方案1】:

您可能想尝试使用RUN 语句来执行您的 bash 脚本,或者直接运行 sed 并结合两个命令和分号:

RUN sed -i -e 's/^#\(logging_collector = \).*/\1on/; s/^\(max_connections = \).*/\11000/' \
    /var/lib/postgresql/data/postgresql.conf

一个更具可扩展性的解决方案是将 sed 程序放在一个外部文件中,然后使用这些语句:

ADD postgres-edit.sed /var/local
RUN sed -i -f /var/local/postgres-edit.sed /var/lib/postgresql/data/postgresql.conf

postgres-edit.sed:

# sed script to edit postgresql configuration

s/^#\(logging_collector = \).*/\1on/
s/^\(max_connections = \).*/\11000/

【讨论】:

  • 如果我在 Dockerfile 中使用它,它将无法工作。
  • 您说单个 sed 命令有效。如果您正在编辑单个文件,则无需多次调用 sed。就像我做的那样,只需用分号加入命令。或者将它们放在一个文件中,每行一个命令,不带分号,然后调用它:sed -i -f postgresql-edit.sed /var/lib/postgresql/data/postgresql.conf
  • 你肯定让我走上了正确的道路。我将所有配置都放在了 postgresql-edit.sed 中。但是,我仍然使用 config.sh 来执行 sed -i -f 命令。通过带有 ADD sed -i -f 的 Dockerfile 完成此操作,根本不起作用。谢谢。
【解决方案2】:

似乎是 How to customize the configuration file of the official PostgreSQL docker image? 的副本。

将我的答案复制粘贴到https://stackoverflow.com/a/40598124/385548


将自定义 postgresql.conf 注入 postgres Docker 容器

默认的 postgresql.conf 文件位于 PGDATA 目录 (/var/lib/postgresql/data) 中,这使事情变得更加复杂,尤其是在第一次运行 postgres 容器时,因为 docker-entrypoint.sh 包装器调用 initdb 步骤PGDATA目录初始化。

要在 Docker 中始终如一地自定义 PostgreSQL 配置,我建议将 config_file postgres 选项与 Docker 卷一起使用,如下所示:

生产数据库(PGDATA dir 作为 Persistent Volume)

docker run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-v $CUSTOM_DATADIR:/var/lib/postgresql/data \
-e POSTGRES_USER=postgres \
-p 5432:5432 \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

测试数据库(PGDATA dir在docker rm之后将被丢弃)

docker run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-e POSTGRES_USER=postgres \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

调试

  1. docker run 命令中删除-d(分离选项)以直接查看服务器日志。
  2. 用psql客户端连接postgres服务器并查询配置:

    docker run -it --rm --link postgres:postgres postgres:9.6 sh -c 'exec psql -h $POSTGRES_PORT_5432_TCP_ADDR -p $POSTGRES_PORT_5432_TCP_PORT -U postgres'
    
    psql (9.6.0)
    Type "help" for help.
    
    postgres=# SHOW all;
    

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 2021-12-30
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多