我试图以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:~$
答案 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
脚本,service
,systemctl
之类的命令在Docker中不起作用。 (它们“不起作用”的另一个明显的地方是作为映像的CMD:容器将立即退出。)只需将守护程序作为容器的主要进程运行即可。
USER postgres
WORKDIR /var/lib/postgresql
CMD ["postgres"]
如果您愿意的话,请考虑只使用the standard postgres
image,它还涵盖了一些有关数据库初始化的棘手情况。