Postgresql Dockerfile运行语句不支持';他似乎没有执行

Postgresql Dockerfile运行语句不支持';他似乎没有执行,postgresql,docker,Postgresql,Docker,我的Dockerfile看起来像这样 FROM postgres:12.2 RUN apt-get install -y postgresql-12-cron \ && echo "shared_preload_libraries = 'pg_cron'" >> \ /var/lib/postgresql/data/postgresql.conf postgresql-12-cron

我的Dockerfile看起来像这样

FROM postgres:12.2

RUN apt-get install -y postgresql-12-cron                     \
 && echo "shared_preload_libraries = 'pg_cron'" >>            \
         /var/lib/postgresql/data/postgresql.conf
postgresql-12-cron包已经安装,尽管它抱怨debconf,无法找到对话框。。。当我执行到创建的容器中时,我可以看到包就在那里

但是,回显行不会出现在配置文件的末尾。我认为apt-get可能返回一些非零的退出代码,这将导致&&无法继续执行下一个语句。我在下面添加了这一行:

RUN echo "shared_preload_libraries = 'pg_cron'" >> /var/lib/postgresql/data/postgresql.conf
这会在构建过程中产生输出,看起来像:

Step 7/7 : RUN echo "shared_preload_libraries = 'pg_cron'" >> /var/lib/postgresql/data/postgresql.conf
但是,在启动并执行到容器中之后,配置文件中仍然没有添加任何行

我模糊地意识到了其他发生这种情况的情况,这不是语法错误或类似的情况,而是编写Dockerfile的人对其工作原理的误解。但我在谷歌上空手而归。我错过了什么

注意:这是Dockerfile的一个简化版本,我尝试在更多的行中回显,而不是我在示例中显示的行(它们都没有出现)

更新:我添加了以下行-

 && tail -n 10 /var/lib/postgresql/data/postgresql.conf
它产生以下输出:

shared_preload_libraries = 'pg_cron'
cron.database_name = 'kardashev'

上面应该有8行(配置文件相当大)。但输出中没有任何内容。此时,文件是空的,我创建的文件在容器实际运行之前就被吹走了。啊。我仍然不知道这意味着什么,尽管我记得几年前的一些事情。

在执行查询的第一部分时:

docker run --rm postgres:12.2 apt-get install -y postgresql-12-cron
容器返回

E: Unable to locate package postgresql-12-cron
由于apt-get末尾的&,它需要在回音之前成功,如果apt-get失败,他将不会执行后面的操作

您应该修复程序包名称,然后重试

编辑: 该包存在,但您需要首先更新您的回购协议。 您的dockerfile应该如下所示:

FROM postgres:12.2

RUN apt-get update \
 && apt-get install -y postgresql-12-cron                     \
 && echo "shared_preload_libraries = 'pg_cron'" >>            \
         /var/lib/postgresql/data/postgresql.conf
声明

该声明使得下面的Dockerfile
RUN
语句无法修改该目录树中的任何文件

对于这样的配置文件,典型的路径是在主机上复制配置文件,然后在启动时将其注入容器中;比如说

docker run -d -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  -v $PWD/postgresql.conf:/var/lib/postgresql/data/postgresql.conf \
  postgres:12.2

(考虑到您都需要安装额外的软件包,还需要修改配置文件,您既需要这样做,也需要构建一个自定义映像。)

我在顶部附近有一个更新语句。它将在命令运行时更新。我甚至在输出中看到
解包postgresql-12-cron(1.2.0-1.pgdg100+1)
。请提供完整的dockerfile,谢谢。我现在明白问题所在了。我不确定我是否喜欢为了让这一切顺利进行而必须跳出的圈圈。
docker run -d -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  -v $PWD/postgresql.conf:/var/lib/postgresql/data/postgresql.conf \
  postgres:12.2