代码之家  ›  专栏  ›  技术社区  ›  Turtle

使用docker compose/docker在运行时将env变量放入前端js文件中

  •  0
  • Turtle  · 技术社区  · 4 年前

    我是使用docker的新手,目前正试图在frontname.js文件中动态设置后端URL 运行时间 我有一个由前端和后端组成的应用程序。到目前为止,后端URL可以在docker-compose.yml中指定,如下所示:

    myFrontend:
    build:
      context: ./frontend-dockerfile-location
      args:
        BACKEND_URL: myBackendUrl
    

    在相应的dockerfile中,我创建了一个nginx库,将我所有的静态文件复制到那里,然后设置正确的后端URL。

    FROM nginx:latest
    #access the arg defined in the yml file
    ARG myBackendUrl
    #write the backend url into the containers environment
    ENV myBackendUrl=${myBackendUrl}
    COPY . /usr/share/nginx/html/
    #replace the config.js URL placeholder with the environment variable
    RUN envsubst < /usr/share/nginx/html/js/config.js > /usr/share/nginx/html/js/config.js.tmp && mv      /usr/share/nginx/html/js/config.js.tmp /usr/share/nginx/html/js/config.js
    

    这种设置的问题是,每当我想更改后端URL时,我总是必须重新构建映像。就在那时,我开始寻找可能的解决方案,如何在运行时更改后端URL。这就是我的第一个问题。是否有可能在运行时更改环境变量,或者运行时是指“启动容器时设置环境变量”?

    我的第二个问题是关于我遇到的可能解决方案。首先,我想知道是否适合我的问题的解决方案是webpack。由于我的前端将提供给客户端并在其浏览器上运行,因此我不能简单地定义env变量并通过process.env访问它们;我还没有一个可行的解决方案,但我相信这可能是我问题的答案。我认为另一种可行的选择是入口点指令。我读到这允许定义starup命令,并想知道是否可以将我当前在dockerfile中使用的shell脚本语法放入shell脚本中,并将其作为我的图像的入口点。如果我理解正确,它在启动容器时总是会运行我的脚本,从而允许我更改URL而无需重建图像。

    如果有人能帮助我解决这些问题,我将不胜感激,因为即使在多次阅读这些概念后,我也很难理解其中的一些概念。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Cyril G.    4 年前

    我使用了与你相同的技巧,使用sed命令替换Javascript中的占位符。我很确定,有更好的方法可以做到这一点。但是,关于您的问题,您可以使用脚本替换占位符,它必须使用CMD或ENTRYPOINT命令与NGINX命令链接执行,URL由env传递,不使用构建参数。

    ....
    #remove ARG + ENV with no value or default
    ENV myBackendUrl
    ...
    CMD envsubst < /usr/share/nginx/html/js/config.js > /usr/share/nginx/html/js/config.js.tmp && mv /usr/share/nginx/html/js/config.js.tmp /usr/share/nginx/html/js/config.js && nginx -g daemon off
    

    在命令行上:

    docker-compose --env-file <env_file> up 
    docker-compose -e myBackendUrl=<url> up