1

我正在尝试在 Cloud Run 上使用 Nginx 提供简单的静态页面。但是容器无法正确开始服务。

容器正在启动,如从以下回显的调试行所示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.shconf.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 上运行和侦听

实际的

  • 容器无法在 Cloud Run 上运行
  • $PORT容器在本地运行和监听
4

2 回答 2

5

我发表了一篇博文,展示了如何在 Cloud Run 容器中运行 nginx(以及一个进程)。

您可以在此处阅读文章: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 上不太可能发生变化。

于 2019-07-23T20:11:53.557 回答
1

通过更换固定

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

于 2019-05-28T06:37:12.670 回答