我正在使用official Postgres Docker image来定制它的配置.为此,我使用命令sed更改max_connections,例如:

sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf

我try 了两种方法来应用这种配置.第一种方法是将命令添加到脚本中,并将其复制到init文件夹"/docker entrypoint initdb.d"中.第二种方法是使用"RUN"命令直接在Dockerfile中运行它们(这种方法适用于非官方Postgresql映像,该映像的配置文件路径不同"/etc/postgres/…").在这两种情况下,更改都会失败,因为配置文件丢失(我认为它尚未创建).

我应该如何更改配置?

编辑1:

以下是用于创建图像的Dockerfile:

# Database (http://www.cs3c.ma/)

FROM postgres:9.4
MAINTAINER Sabbane <contact@cs3c.ma>

ENV TERM=xterm

RUN apt-get update
RUN apt-get install -y nano

ADD scripts /scripts
# ADD scripts/setup-my-schema.sh /docker-entrypoint-initdb.d/

# Allow connections from anywhere.
RUN sed -i -e"s/^#listen_addresses =.*$/listen_addresses = '*'/" /var/lib/postgresql/data/postgresql.conf
RUN echo "host    all    all    0.0.0.0/0    md5" >> /var/lib/postgresql/data/pg_hba.conf

# Configure logs
RUN sed -i -e"s/^#logging_collector = off.*$/logging_collector = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_directory = 'pg_log'.*$/log_directory = '\/var\/log\/postgresql'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_filename = 'postgresql-\%Y-\%m-\%d_\%H\%M\%S.log'.*$/log_filename = 'postgresql_\%a.log'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_file_mode = 0600.*$/log_file_mode = 0644/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_truncate_on_rotation = off.*$/log_truncate_on_rotation = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_rotation_age = 1d.*$/log_rotation_age = 1d/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_min_duration_statement = -1.*$/log_min_duration_statement = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_checkpoints = off.*$/log_checkpoints = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_connections = off.*$/log_connections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_disconnections = off.*$/log_disconnections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^log_line_prefix = '\%t \[\%p-\%l\] \%q\%u@\%d '.*$/log_line_prefix = '\%t \[\%p\]: \[\%l-1\] user=\%u,db=\%d'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_lock_waits = off.*$/log_lock_waits = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_temp_files = -1.*$/log_temp_files = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#statement_timeout = 0.*$/statement_timeout = 1800000        # in milliseconds, 0 is disabled (current 30min)/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^lc_messages = 'en_US.UTF-8'.*$/lc_messages = 'C'/" /var/lib/postgresql/data/postgresql.conf

# Performance Tuning
RUN sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^shared_buffers =.*$/shared_buffers = 16GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#effective_cache_size = 128MB.*$/effective_cache_size = 48GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#work_mem = 1MB.*$/work_mem = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#maintenance_work_mem = 16MB.*$/maintenance_work_mem = 2GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_segments = .*$/checkpoint_segments = 32/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_completion_target = 0.5.*$/checkpoint_completion_target = 0.7/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#wal_buffers =.*$/wal_buffers = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#default_statistics_target = 100.*$/default_statistics_target = 100/" /var/lib/postgresql/data/postgresql.conf


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

CMD ["postgres"]

使用此Dockerfile,构建过程显示错误:sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory

推荐答案

您从中继承的postgres:9.4个映像在/var/lib/postgresql/data处声明了一个卷.这本质上意味着你不能将任何文件复制到你的图像中的路径;这些更改将被丢弃.

你有几个 Select :

  • 您只需在运行时将自己的配置文件添加为一个卷,使用docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ....然而,我不确定这将如何与现有卷交互.

  • 您可以在容器启动时复制文件.要做到这一点,请将文件复制到不在卷下面的构建位置,然后从入口点或cmd调用脚本,将文件复制到正确的位置并启动postgres.

  • 克隆Postgres官方映像后面的项目,编辑Dockerfile以在声明卷之前添加自己的配置文件(在运行时自动复制卷指令之前添加的任何内容).

  • 在docker compose文件的命令选项中传递所有配置更改

比如:

services:
  postgres:
    ...  
    command:
      - "postgres"
      - "-c"
      - "max_connections=1000"
      - "-c"
      - "shared_buffers=3GB"
      - "-c"
      ...

Postgresql相关问答推荐

如何获取实例化视图的列级权限?

如何在PostgreSQL中正确删除数据库

为什么我的应用程序接收的是空值而不是布尔值?

如何在PostgreSQL中 Select 最近30天内的开始日期?

仅使用 ssl 连接到 Postgresql 数据库

postgres vacuum 是否改进了我的查询计划

PostgreSQL - 如何获得前一个月和一周的价值?

连接 Supbase Postgresql 数据库时,Stepzen Graphiql 资源管理器中的主机名解析错误

Rails 迁移:PostgreSQL 上的 Bigint 似乎失败了?

try 访问本地主机中的数据库时如何解决Error: The server does not support SSL connections?

Postgres中的GROUP BY - JSON数据类型不相等?

PostgreSQL:根据排序顺序仅 Select 每个 id 的第一条记录

psql:致命:connection requires a valid client certificate

返回 NULL 的空数组的 array_length()

postgresql:致命:password authentication failed for user "douglas"

从没有行的计数中获取 0 值

如何在数据库表中查找重复条目?

在 postgresql 中,如何在 jsonb 键上返回布尔值而不是字符串?

仅在存在时重命名列

每个数据库提供程序类型允许的最大参数数是多少?