Проблема разрешения сборки Docker при запуске PostgreSQL 11 в Debian 8.6 Джесси - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь запустить PostgreSQL 11 как пользователь postgres в базовой системе Debian 8.6:

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

Я немного сбит с толку этим сообщением, так как этот файл существует на хосте , тогда как эта ошибка происходит внутри контейнера (более правильно при построенииimage).

Работая с уменьшенной версией сборки и регистрируя полученный контейнер, я пытаюсь эмулировать ошибку, выполняя команды вручную.Это не дает ошибок однако:

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 Ответ

2 голосов
/ 03 июля 2019

У вас есть одна практическая проблема и одна скрытая концептуальная проблема.

Практическая проблема заключается в том, что говорит ваше сообщение об ошибке.Текущий WORKDIR, который вы, вероятно, унаследовали от своего базового образа, равен /root, что обычно соответствует режиму 0700 (то есть недоступен никому, кроме пользователя root).Ваш Dockerfile указывает USER postgres и затем пытается RUN что-нибудь.Докер сначала пытается chdir (2) к текущему WORKDIR, но не может, потому что у него нет разрешения.

Простой обходной путь - установить WORKDIR вчто-нибудь еще, когда вы меняете пользователей.Каждая команда RUN внутренне запускает новый контейнер, выполняет свою работу и завершает работу , и все процессы, оставшиеся в этом контейнере, теряются .Если нет каких-либо побочных эффектов, помимо запуска процесса, такие строки, как RUN /etc/init.d/... start, не являются операционными.

В общем, вы должны считать, что такие команды, как /etc/init.d scripts, service, systemctl и тому подобное, простоне работай в докере.(Другое очевидное место, где они «не работают» - это CMD изображения: контейнер немедленно выйдет.) Просто запустите демон как основной процесс контейнера.

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

Рассмотрите возможность использования стандартный postgres image , если это вариант для вас, который также охватывает некоторые сложные моменты, связанные с инициализацией базы данных.

...