当前位置: 首页 > 知识库问答 >
问题:

如何自定义官方PostgreSQL Docker映像的配置文件?

符懿轩
2023-03-14

我正在使用Postgres Docker的官方图片来定制它的配置。为此,我使用命令sed来更改max\u连接,例如:

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

我尝试了两种方法来应用此配置。第一种方法是将命令添加到脚本中,并将其复制到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,构建过程显示错误:se:无法读取 /var/lib/postgresql/data/postgresql.conf:没有这样的文件或目录

共有3个答案

江光明
2023-03-14

默认的postgresql。conf文件位于PGDATA目录(/var/lib/postgresql/data)中,这使得事情更加复杂,尤其是在首次运行postgres容器时,因为docker入口点。shwrapper为PGDATAdir初始化调用initdb步骤。

为了一致地定制Docker中的PostgreSQL配置,我建议将config_filepostgres选项与Docker卷一起使用,如下所示:

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
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

>

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;
澹台鸿熙
2023-03-14

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

你有几个选择:

>

  • 您可以在运行时使用docker run-vpostgresql.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"
          ...
    

  • 梁研
    2023-03-14

    使用Docker Compose时,您可以在Docker Compose中使用命令:postgres-c option=value。yml配置Postgres。

    例如,这会使Postgres记录到一个文件:

    command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs
    

    根据Vojtech Vitek的回答,您可以使用

    command: postgres -c config_file=/etc/postgresql.conf
    

    更改Postgres将使用的配置文件。您可以使用一个卷挂载自定义配置文件:

    volumes:
       - ./customPostgresql.conf:/etc/postgresql.conf
    

    这是docker撰写的。我的应用程序的yml,显示如何配置Postgres:

    # Start the app using docker-compose pull && docker-compose up to make sure you have the latest image
    version: '2.1'
    services:
      myApp:
        image: registry.gitlab.com/bullbytes/myApp:latest
        networks:
          - myApp-network
      db:
         image: postgres:9.6.1
         # Make Postgres log to a file.
         # More on logging with Postgres: https://www.postgresql.org/docs/current/static/runtime-config-logging.html
         command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs
         environment:
           # Provide the password via an environment variable. If the variable is unset or empty, use a default password
           # Explanation of this shell feature: https://unix.stackexchange.com/questions/122845/using-a-b-for-variable-assignment-in-scripts/122848#122848
           - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-4WXUms893U6j4GE&Hvk3S*hqcqebFgo!vZi}
         # If on a non-Linux OS, make sure you share the drive used here. Go to Docker's settings -> Shared Drives
         volumes:
           # Persist the data between container invocations
           - postgresVolume:/var/lib/postgresql/data
           - ./logs:/logs
         networks:
           myApp-network:
             # Our application can communicate with the database using this hostname
             aliases:
               - postgresForMyApp
    networks:
      myApp-network:
        driver: bridge
    # Creates a named volume to persist our data. When on a non-Linux OS, the volume's data will be in the Docker VM
    # (e.g., MobyLinuxVM) in /var/lib/docker/volumes/
    volumes:
      postgresVolume:
    

    请注意,在Linux时,主机上的日志文件目录必须具有正确的权限。否则你会得到一个有点误导性的错误

    致命:无法打开日志文件“/logs/postgresql-2017-02-04_115222.log”:权限被拒绝

    我说的是误导,因为错误消息表明容器中的目录具有错误的权限,而实际上主机上的目录不允许写入。

    为了解决这个问题,我在主机上使用设置了正确的权限

    chgroup ./logs docker && chmod 770 ./logs
    
     类似资料:
    • 问题内容: 我正在使用官方的Postgres Docker映像 尝试自定义其配置。为此,我使用命令来更改例如: 我尝试了两种方法来应用此配置。第一种是通过将命令添加到脚本并将其复制到init文件夹“ /docker-entrypoint- initdb.d”中。第二种方法是通过使用“ RUN”命令直接在我的Dockerfile中运行它们(此方法在非官方的Postgresql映像(与配置文件“ /

    • 本文向大家介绍docker官方mysql镜像自定义配置详解,包括了docker官方mysql镜像自定义配置详解的使用技巧和注意事项,需要的朋友参考一下 之前为了节省安装时间,所以用官方mysql docker镜像启动mysql。 通过 some-mysql 指定了该容器的名字,my-secret-pw 指定了 root 用户的密码,tag 参数指定了你想要的 MySQL 版本 这样数据是没有持久化

    • MOSN 自定义配置说明。 本文是对 MOSN 自定义配置的说明。 Duration String 字符串,由一个十进制数字和一个时间单位后缀组成,有效的时间单位为 ns、us(或?s)、ms、s、m、h,例如 1h、3s、500ms。 metadata metadata 用于 MOSN 路由和 Cluster Host 之间的匹配。 { "filter_metadata":{ "mo

    • 如果你想自定义 Next.js 的高级配置,可以在根目录下新建next.config.js文件(与pages/ 和 package.json一起) 注意:next.config.js是一个 Node.js 模块,不是一个 JSON 文件,可以用于 Next 启动服务已经构建阶段,但是不作用于浏览器端。 // next.config.js module.exports = { /* config

    • 我想将ssh服务添加到容器中。我可以软件包(在之后),但我不知道如何启动它。通常(不在此容器中),我们可以通过的常规命令启动服务。但我不知道如何在容器中做到这一点而不干扰和机制。 dockerfile附带了一个(请参阅此处的源代码),它非常希望有一行用于 我看过一些相关的SO文章,比如这些: null 但由于docker文件中的和的相互作用,它们在这里并不直接适用。

    • Gitea 引用 custom 目录中的自定义配置文件来覆盖配置、模板等默认配置。 如果从二进制部署 Gitea ,则所有默认路径都将相对于该 gitea 二进制文件;如果从发行版安装,则可能会将这些路径修改为Linux文件系统标准。Gitea 将会自动创建包括 custom/ 在内的必要应用目录,应用本身的配置存放在 custom/conf/app.ini 当中。在发行版中可能会以 /etc/g