自定义PostgreSQL官方docker镜像

时间:2016-03-27 14:49:33

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

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

  

/docker-entrypoint.sh:正在运行/docker-entrypoint-initdb.d/config.sh
  :没有这样的文件或directoryread   /var/lib/postgresql/data/postgresql.conf

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

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

Dockerfile:

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

database.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"

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:-1)

似乎是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 dir初始化的PGDATA步骤。

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

生产数据库(PGDATA dir as 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. -d命令中删除docker run(分离选项)以直接查看服务器日志。
  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;