在Debian 8.6 Jessie上启动PostgreSQL 11的Docker构建权限问题

时间:2019-07-03 09:30:18

标签: postgresql docker debian dockerfile debian-jessie

我试图以Debian 8.6基本系统上的postgres用户身份启动PostgreSQL 11:

FROM xxx.amazonaws.com/groen/debian-jessie

ENV DEBIAN_FRONTEND noninteractive

ADD powerUp             /etc/my_runalways/startup-postgresql
RUN chmod -R 700        /etc/my_runalways/startup-postgresql
RUN sed -i '/updates/d' /etc/apt/sources.list

RUN apt-get update
RUN apt-get -y -q install wget
RUN apt-get --force-yes -y -q install postgresql-11 postgresql-client-11

USER postgres

RUN    /etc/init.d/postgresql start  

但是我遇到了一个似乎无关的权限错误,该错误源自config.json文件:

Step 10/17 : RUN apt-get -y -q install postgresql-11 postgresql-client-11
 ---> Using cache
 ---> 676bf87b8145
Step 11/17 : USER postgres
 ---> Using cache
 ---> e54a93b7ba49
Step 12/17 : RUN    /etc/init.d/postgresql start
 ---> Running in 50d6fa1c1825
OCI runtime create failed: container_linux.go:345: starting container process caused "chdir to cwd (\"/root\") set in config.json failed: permission denied": unknown

此消息让我有点困惑,因为该文件位于 host 上,而此错误发生在 容器内(构建映像时更正确)。 / p>

使用精简版本的构建,并登录生成的容器,我尝试通过手动执行命令来模拟错误。但是,这没有错误:

postgres@10f5e189ca95:~$ groups
postgres ssl-cert
postgres@10f5e189ca95:~$ ls -lrta /etc/init.d/postgresql
-rwxr-xr-x 1 root root 1490 Feb 21  2016 /etc/init.d/postgresql
postgres@10f5e189ca95:~$ /etc/init.d/postgresql start
[ ok ] Starting PostgreSQL 11 database server: main.
postgres@10f5e189ca95:~$ /etc/init.d/postgresql status
11/main (port 5432): online
postgres@10f5e189ca95:~$

1 个答案:

答案 0 :(得分:2)

您有一个实际问题和一个潜伏的概念问题。

实际问题是您的错误消息所说的。当前的WORKDIR(可能已从基本映像继承)为/root,通常为0700模式(即,除root用户以外的任何人都无法访问)。您的Dockerfile指定USER postgres,然后尝试RUN进行任何操作。 Docker首先尝试 chdir (2)到当前的WORKDIR,但是不能,因为它没有权限。

一个简单的解决方法是在更改用户时将WORKDIR设置为其他任何方式

USER postgres
WORKDIR /

一旦您过去,您将再碰到一件事。每个RUN命令都会在内部启动一个新容器,执行其工作,然后退出,,并且该容器中正在运行的所有进程都会丢失。除非开始进行此过程之前没有其他副作用,否则RUN /etc/init.d/... start之类的行是无操作的。

广泛地,您应该假设/etc/init.d脚本,servicesystemctl之类的命令在Docker中不起作用。 (它们“不起作用”的另一个明显的地方是作为映像的CMD:容器将立即退出。)只需将守护程序作为容器的主要进程运行即可。

USER postgres
WORKDIR /var/lib/postgresql
CMD ["postgres"]

如果您愿意的话,请考虑只使用the standard postgres image,它还涵盖了一些有关数据库初始化的棘手情况。