PostgreSQL泊坞窗图像build立错误

我正在为源代码创build一个用于postgresql安装的docker镜像。 这里是我根据postgresql文档创build的Dockerfile:

FROM ubuntu RUN apt-get update && apt-get install gcc zlib1g-dev libreadline6-dev apt-utils make -y RUN mkdir -p /tmp/downloads ADD https://ftp.postgresql.org/pub/source/v9.6.6/postgresql-9.6.6.tar.gz /tmp/downloads RUN cd /tmp/downloads && tar -zxf postgresql-9.6.6.tar.gz RUN cd /tmp/downloads/postgresql-9.6.6 && make configure RUN cd /tmp/downloads/postgresql-9.6.6 && ./configure RUN cd /tmp/downloads/postgresql-9.6.6 && make RUN cd /tmp/downloads/postgresql-9.6.6 && su RUN cd /tmp/downloads/postgresql-9.6.6 && make install RUN cd /tmp/downloads/postgresql-9.6.6 && adduser postgres RUN cd /tmp/downloads/postgresql-9.6.6 && mkdir /usr/local/pgsql/data RUN cd /tmp/downloads/postgresql-9.6.6 && chown postgres /usr/local/pgsql/data RUN cd /tmp/downloads/postgresql-9.6.6 && su postgres RUN cd /tmp/downloads/postgresql-9.6.6 && /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data RUN cd /tmp/downloads/postgresql-9.6.6 && /usr/local/pgsql/bin/createdb test RUN cd /tmp/downloads/postgresql-9.6.6 && /usr/local/pgsql/bin/psql test 

所以当我运行docker build -t roksolanad/psql:latest . 我收到错误:

 initdb: cannot be run as root Please log in (using, eg, "su") as the (unprivileged) user that will own the server process. The command '/bin/sh -c cd /tmp/downloads/postgresql-9.6.6 && /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data' returned a non-zero code: 1 

那么我该如何解决我的Dockerfile呢? 我会非常感谢一些帮助!

正如@Harald Nordgren所说的,如果可能的话,您需要在一个命令中总结所有RUN命令

除此之外还有一些导致失败的事情

1)添加“postgres”用户:

“adduser”需要在添加用户时configuration额外的参数 ,正如您在注释中提到的那样,比如询问密码等。 所以你需要修改命令来禁用参数以及如下所示的密码:

 adduser postgres --gecos '' --disabled-login 

2)使用root用户执行postgress

当你执行命令“ su postgres ”时,它以root用户执行。 但是,我们已经改变了上述命令的权限“ chown postgres / usr / local / pgsql / data”

为此,您需要执行命令为“postgres”用户,可以通过在dockerfile中添加USER来启用该用户

最后你的Dockerfile看起来像这样:

 FROM ubuntu RUN apt-get update && apt-get install gcc zlib1g-dev libreadline6-dev apt-utils make -y RUN mkdir -p /tmp/downloads ADD https://ftp.postgresql.org/pub/source/v9.6.6/postgresql-9.6.6.tar.gz /tmp/downloads RUN cd /tmp/downloads && tar -zxf postgresql-9.6.6.tar.gz RUN cd /tmp/downloads/postgresql-9.6.6 &&\ make configure &&\ ./configure &&\ make &&\ su &&\ make install &&\ adduser postgres --gecos '' --disabled-login &&\ mkdir /usr/local/pgsql/data &&\ chown postgres /usr/local/pgsql/data USER postgres #use below command only if it is necessary, it is similar to "cd" linux command WORKDIR /tmp/downloads/postgresql-9.6.6 RUN /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data 

有了这个, 我能够创build一个Docker镜像并进行testing 。 添加更多可能有用的信息。

 # docker run -it postgres:2.0 /bin/bash postgres@8354d83023f9:/tmp/downloads/postgresql-9.6.6$ ps -eaf UID PID PPID C STIME TTY TIME CMD postgres 1 0 0 10:58 ? 00:00:00 /bin/bash postgres 9 1 0 10:59 ? 00:00:00 ps -eaf postgres@8354d83023f9:/tmp/downloads/postgresql-9.6.6$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start server starting postgres@8354d83023f9:/tmp/downloads/postgresql-9.6.6$ ps -eaf UID PID PPID C STIME TTY TIME CMD postgres 1 0 0 10:58 ? 00:00:00 /bin/bash postgres 13 1 0 10:59 ? 00:00:00 /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data postgres 15 13 0 10:59 ? 00:00:00 postgres: checkpointer process postgres 16 13 0 10:59 ? 00:00:00 postgres: writer process postgres 17 13 0 10:59 ? 00:00:00 postgres: wal writer process postgres 18 13 0 10:59 ? 00:00:00 postgres: autovacuum launcher process postgres 19 13 0 10:59 ? 00:00:00 postgres: stats collector process postgres 20 1 0 10:59 ? 00:00:00 ps -eaf postgres@8354d83023f9:/tmp/downloads/postgresql-9.6.6$ /usr/local/pgsql/bin/createdb test postgres@8354d83023f9:/tmp/downloads/postgresql-9.6.6$ /usr/local/pgsql/bin/psql test psql (9.6.6) Type "help" for help. test=# test=# 

还有其他的方法来build立这个docker的形象,但这样我能够。

问题是每个RUN创build自己的shell。 这意味着用户名更改只保留一个实例。 这与任何将会持续的文件系统更改都是不同的。

尝试像这样链接你的命令:

 RUN cd /tmp/downloads/postgresql-9.6.6 &&\ make configure &&\ ./configure &&\ make &&\ su &&\ make install &&\ adduser postgres &&\ mkdir /usr/local/pgsql/data &&\ chown postgres /usr/local/pgsql/data RUN cd /tmp/downloads/postgresql-9.6.6 &&\ su postgres &&\ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data &&\ /usr/local/pgsql/bin/createdb test &&\ /usr/local/pgsql/bin/psql test