Контейнер 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 файлы, чтобы избежать неясностей замены

Другие вопросы по тегам