Контейнер Nginx не запускается в Cloud Run
Я пытаюсь показать простую статическую страницу с Nginx в Cloud Run. Но контейнер не может правильно начать обслуживать.
Контейнер запускается, как показывают строки отладки, отраженные от docker-entrypoint.sh
:
2019-05-26T22:19:02.340289Z testing config
2019-05-26T22:19:02.433935Z nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2019-05-26T22:19:02.434903Z nginx: configuration file /etc/nginx/nginx.conf test is successful
2019-05-26T22:19:02.436605Z starting on 8080
2019-05-26T22:19:02.487188Z2019/05/26 22:19:02 [alert] 6#6: prctl(PR_SET_DUMPABLE) failed (22: Invalid argument)
и в конце концов заканчивается
2019-05-26T22:20:00.153060259ZContainer terminated by the container manager on signal 9.
Для того, чтобы соответствовать договору на обслуживание Cloud Run специально прослушивание $PORT
docker-entrypoint.sh
выполняет подстановку $PORT в conf.d/*.conf
,
FROM nginx:1.15-alpine
COPY nginx-default.conf.template /etc/nginx/conf.d/default.conf.template
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]
Я уверен, что проблема заключается в docker-entrypoint.sh
потому что однажды $PORT закодирован как 8080
и изображение выглядит так:
FROM nginx:1.15-alpine
COPY nginx-default.conf /etc/nginx/conf.d/default.conf
Cloud Run "работает" нормально.
Код, выполняющий замену:
export NGINX_PORT=${PORT:-8080}
for f in $(find /etc/nginx/conf.d/ -type f -name '*.conf'); do
envsubst '$NGINX_PORT' < $f > $f
done
ПРИМЕЧАНИЕ: чтение < $f
и писать > $f
к тому же файлу работает, как проверено, выполняя контейнер локально.
ожидаемый
- Конфигурация nginx получает
$PORT
заполнитель заменен фактическими значениями - контейнер работает и слушает
$PORT
в облачном беге
фактический
- контейнер не запускается в Cloud Run
- контейнер работает и слушает
$PORT
в местном масштабе
1 ответ
Я опубликовал сообщение в блоге, чтобы показать, как запускать nginx в контейнере Cloud Run (вместе с процессом).
Вы можете прочитать статью здесь: https://ahmet.im/blog/cloud-run-multiple-processes-easy-way/ или взглянуть на репозиторий кода по адресу https://github.com/ahmetb/multi- ленивый-контейнер-процесс
По сути, файл nginx.conf должен выглядеть примерно так:
events {}
http {
server {
listen 8080; # Cloud Run PORT env variable
access_log /dev/stdout;
error_log /dev/stdout;
# if you need to serve static access, specify an absolute path like below
location /static/ {
alias /src/static/;
}
# anything else is routed to your app that you would start on port 8081
location / {
proxy_pass http://localhost:8081;
}
}
}
daemon off;
pid /run/nginx.pid;
Вы можете безопасно отсортировать порт 8080 жесткого кода в своем nginx.conf
поскольку в обозримом будущем Cloud Run вряд ли что-то изменится.
Исправлено заменой
for f in $(find /etc/nginx/conf.d/ -type f -name '*.conf'); do
envsubst '$NGINX_PORT' < $f > $f
done
с
sed -i "s/\${NGINX_PORT}/${NGINX_PORT}/g" /etc/nginx/conf.d/*.conf
и меняется $NGINX_PORT
-> ${NGINX_PORT}
в *.conf
файлы, чтобы избежать неясностей замены