Конфигурация 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