У вас есть одна практическая проблема и одна скрытая концептуальная проблема.
Практическая проблема заключается в том, что говорит ваше сообщение об ошибке.Текущий 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 , если это вариант для вас, который также охватывает некоторые сложные моменты, связанные с инициализацией базы данных.