首页 > 解决方案 > 尝试将 env args 从 openshift 配置获取到 Dockerfile,然后使用 envsubst 进入 nginx 配置

问题描述

因此,我将一个 React 应用程序部署到 Openshift 中,它将调用一个单独的 API 服务,我需要根据登台环境 dev 或 prod 确定我的 nginx.conf 中的 proxy_pass。这似乎是一个足够常见的用例,但似乎极难实现。我正在为我的 nginx 服务器使用 nginxinc/nginx-unprivileged 而不是常规的 nginx 映像 - 我不知道这是否会导致任何问题。似乎在 nginx.conf 文件中使用支持 envsubst 的 nginx 1.19。

我想要做的是:

  1. 在我的 buildConfig.yml 和 prodBuildConfig.yml 中分别定义一个 proxy_url 环境变量
  2. 在我的 Dockerfile 中触发 envsubst 以替换我的 nginx.conf 中的变量以传递给 proxy_pass

代码看起来像这样

buildConfig.yml

...
  spec:
  resources: {}
  strategy:
    dockerStrategy:
      env:
        - name: "API_URL"
          value: "http://devservice:8080"
      dockerfilePath: Dockerfile

Dockerfile

...
CMD /bin/bash -c "envsubst '\$API_URL' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

最后是 nginx.conf

...
location /api {
    proxy_pass ${API_URL};
}

但似乎没有任何效果。我已经尝试过一百万种 CMD bin/sh envsubst 命令的变体,例如

CMD /bin/sh -c envsubst \${API_URL} < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'

我试过改变引号,就像我在很多帖子上看到的那样,我尝试过使用 bin/sh 与 bin/bash,我尝试过将 conf 文件的名称更改为 nginx.conf.template或者只是 default.temp,我尝试将 nginx 模板复制到 etc/nginx/templates 文件夹中,该文件夹应该会自动运行 envsubst 并将其放入 /conf.d/ 中,但这不起作用。我基本上都试过了。我对 Openshift、Docker 和 Nginx 完全陌生,所以我真的不知道这个工作流程应该是什么样子,也不知道我是否过于复杂或只是走错了路。我错过了什么?请尽可能明确地解释您如何解释事物,因为我是这些技术的新手。

标签: dockernginxdockerfileopenshiftnginx-config

解决方案


我做了以下事情:

  • 首先,您必须将 perl 添加到您的nginx.conf并添加您的环境变量,如图所示
  • 其次,您必须在您的环境变量中使用您的环境变量,default.conf如图所示

推荐阅读