Конфигурация Nginx в OpenShift

Я боролся с решением, позволяющим запустить nginx, в OpenShift пользователь root не используется при создании контейнеров. Затем я получил следующую ошибку:

      2023/06/21 10:37:45 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)
nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)

Это происходит потому, что пользователь не является пользователем root. Для конфигурации используется следующий файл Dockerfile:

      # base image
FROM node:14.21.2 as build-deps

#more lines

RUN yarn build

FROM nginx:1.19-alpine
COPY --from=build-deps /usr/src/app/build /usr/share/nginx/html
COPY --from=build-deps /usr/src/app/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

RUN printenv
RUN ln -s /tmp/env.js /usr/share/nginx/html/static/env.js
CMD ["sh", "-c", "envsubst < /usr/share/nginx/html/static/env.template.js > /tmp/env.js && exec nginx -g 'daemon off;'"]

Затем я изменил образ nginx, чтобы использовать nginxinc/nginx-unprivileged:1.23.2 , чтобы избежать проблем при создании каталога./var/cache/nginx/client_temp. Я изменил показанный выше Dockerfile, удалив символическую ссылку, и изменил последнюю строку, чтобы она ссылалась на исходный путь:

      CMD ["sh", "-c", "envsubst < /usr/share/nginx/html/static/env.template.js > /usr/share/nginx/html/static/env.js && exec nginx -g 'daemon off;'"]

Однако, поскольку этот образ (ОС Debian) использует nginx в качестве пользователя, у меня возникли проблемы с созданием файла env.js:

      sh: 1: cannot create /usr/share/nginx/html/static/env.js: Permission denied

Если я хочу продолжить создание символической ссылки в качестве первого примера файла Docker, я получаю следующую ошибку:

      ln: failed to create symbolic link '/usr/share/nginx/html/static/env.js': Permission denied

В этом изображении используется nginx, принадлежащий группе nginx:

      $ howami
/bin/sh: 1: howami: not found
$ id nginx
uid=101(nginx) gid=101(nginx) groups=101(nginx)

попытка создать символическую ссылку на файл env.js в статической папке не удалась, поскольку nginx не является частью корневой группы:

      $ cd /usr/share/nginx/html/
$ ls -ltr
drwxr-xr-x 5 root root 4096 Jun 20 22:58 static

Я не могу изменить права доступа к каталогу, потому что это происходит до запуска контейнера.

Как я могу разместить переменные среды в папке /usr/share/nginx/html/static так же, как я пытался сделать с envsubst, и иметь env.js со значениями?

Большое спасибо

1 ответ

Я боролся с решением, позволяющим запустить nginx, в OpenShift пользователь root не используется при создании контейнеров.

Это неправильно; хотя OpenShift по умолчанию не позволяет вам запускать контейнеры от имени пользователя root, вы, безусловно, можете настроить необходимые разрешения. Если вы работаете с OpenShift 4, то в документации вас интересует раздел « Управление ограничениями контекста безопасности ».

Буквально вчера я собрал пример, демонстрирующий это для коллеги; Вы можете найти это здесь .


В вашем Dockerfile эта команда не работает:

      RUN ln -s /tmp/env.js /usr/share/nginx/html/static/env.js

Это потому что:

  • /usr/share/nginx/htmlпринадлежит root
  • В настоящее время вы баллотируетесь какnginxпользователь

Вы можете это исправить, явно переключившись наrootпользователь в вашем Dockerfile:

      USER root
RUN ln -s /tmp/env.js /usr/share/nginx/html/static/env.js
USER nginx
Другие вопросы по тегам