Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker从文件合成构建时参数_Docker_Webpack_Docker Compose_Open Source_Next.js - Fatal编程技术网

Docker从文件合成构建时参数

Docker从文件合成构建时参数,docker,webpack,docker-compose,open-source,next.js,Docker,Webpack,Docker Compose,Open Source,Next.js,我知道可用的变量替换,我可以在项目的根目录下使用.env,这样就可以了,但在这种情况下,我正在调整现有的项目,其中需要现有的.env文件位置,我希望避免在多个文件上有var条目 有关更多信息,请参阅,所有代码都可以在回购的docker support分支上作为WIP提供,但我将在下面简要描述该项目和问题: 项目结构 或者看看整个过程,顺便说一下,它目前运行得很好,但是在为登台/制作构建映像时,saas应用程序存在一个问题,我到目前为止可以确定这个问题 问题 在构建时,Next.js使用webpa

我知道可用的变量替换,我可以在项目的根目录下使用
.env
,这样就可以了,但在这种情况下,我正在调整现有的项目,其中需要现有的
.env
文件位置,我希望避免在多个文件上有var条目

有关更多信息,请参阅,所有代码都可以在回购的
docker support
分支上作为WIP提供,但我将在下面简要描述该项目和问题:

项目结构 或者看看整个过程,顺便说一下,它目前运行得很好,但是在为登台/制作构建映像时,
saas应用程序
存在一个问题,我到目前为止可以确定这个问题

问题 在构建时,Next.js使用webpack构建页面的静态版本,以完成
process.env
substitution,因此,它要求在docker build阶段包含实际的最终运行变量,这样next.js就不需要在运行时再次重建,而且还可以在流量需要时安全地生成多个实例

我知道,如果在运行时没有发送相同的变量,那么它将不得不不顾本练习的重点再次重建,但这正是我在这里试图阻止的,如果发送错误的值,那是我们的问题,而不是项目

和我也需要考虑NEX.JS Bu建d ID管理,但这是另一个时间/问题。

尝试 我一直在测试,包括应用程序在其上预期的每个变量的ARG和ENV声明,例如:

这正如预期的那样工作,但是它迫使我在文件中手动声明它们,这并不理想:

  saas-app:
    build:
      context: app
      args:
        GA_TRACKING_ID: UA-xXxXXXX-X
我不能在这里使用变量替换,因为我的根
.env
不包含此变量,它在
/app/.env
上,我也测试了将值保留为空,但它没有从
env_文件
环境
定义中获取它,我相信这是预期的

我有一个完整的
docker compose config
输出,其中包含存储库中的现有版本:

理想情况下,我希望:

  saas-app:
    build:
      args:
        LOG_LEVEL: notice
        NODE_ENV: development
        PORT: '3000'
      context: /home/pedro/src/opensource/saas-boilerplate/app
    command: yarn start
    container_name: saas-app
    depends_on:
    - saas-api
    environment:
      ...
成为:

  saas-app:
    build:
      args:
        LOG_LEVEL: notice
        NODE_ENV: development
        PORT: '3000'
        BUCKET_FOR_POSTS: xxxxxx
        BUCKET_FOR_TEAM_AVATARS: xxxxxx
        GA_TRACKING_ID: ''
        LAMBDA_API_ENDPOINT: xxxxxxapi
        NODE_ENV: development
        STRIPEPUBLISHABLEKEY: pk_test_xxxxxxxxxxxxxxx
        URL_API: http://api.saas.localhost:8000
        URL_APP: http://app.saas.localhost:3000
      context: /home/pedro/src/opensource/saas-boilerplate/app
    command: yarn start
    container_name: saas-app
    depends_on:
    - saas-api
    environment:
      ...
问题 如果可能,我将如何实现这一目标,但是:

  • 无需将现有的
    .env
    文件合并到单个根目录中,或在多个文件上复制变量
  • 无需手动声明compose文件上的值,也无需在命令(例如,
    docker compose build--build arg GA_TRACKING_ID=UA-xXxXXXX-X
    )上推断它们
  • 不必在测试过程中复制每个
    .env
    文件,因为它感觉不正确和/或不安全
  • 也许在我看来,撰写团队的撰写
    build
    options功能请求中的
    args\u文件是有效的,您是否也这么说
  • 或者在compose文件上有一个root选项,您可以在其中为变量替换设置多个
    .env
    文件
  • 或者是我没有看到的另一个解决方案?有什么想法吗
  • 我不介意将每个
    .env
    文件作为一个文件发送,或者,这是一个比拆分组合文件更干净的解决方案,是否有人在生产中运行这样的示例

  • 而不是尝试在多个.EV中传递和合并值。您会考虑制作一个Meave.Env并使API和APP服务继承相同的根吗?Env?< /P> < P>我已经成功地达成了一个不影响任何现有开发工作流的折衷方案,它也不允许应用程序在没有环境变量的情况下构建(这对于生产构建来说更为重要)

    我基本上决定重用docker的内部功能来读取
    .env
    文件,并在compose文件中使用变量替换功能,下面是一个示例:

    # compose
    COMPOSE_TAG_NAME=stage
    
    # common to api and app (build and run)
    LOG_LEVEL=notice
    NODE_ENV=development
    URL_APP=http://app.saas.localhost:3000
    URL_API=http://api.saas.localhost:8000
    API_PORT=8000
    APP_PORT=3000
    
    # api (run)
    MONGO_URL=mongodb://saas:secret@saas-mongo:27017/saas
    SESSION_NAME=saas.localhost.sid
    SESSION_SECRET=3NvS3Cr3t!
    COOKIE_DOMAIN=.saas.localhost
    GOOGLE_CLIENTID=
    GOOGLE_CLIENTSECRET=
    AMAZON_ACCESSKEYID=
    AMAZON_SECRETACCESSKEY=
    EMAIL_SUPPORT_FROM_ADDRESS=
    MAILCHIMP_API_KEY=
    MAILCHIMP_REGION=
    MAILCHIMP_SAAS_ALL_LIST_ID=
    STRIPE_TEST_SECRETKEY=
    STRIPE_LIVE_SECRETKEY=
    STRIPE_TEST_PUBLISHABLEKEY=
    STRIPE_LIVE_PUBLISHABLEKEY=
    STRIPE_TEST_PLANID=
    STRIPE_LIVE_PLANID=
    STRIPE_LIVE_ENDPOINTSECRET=
    
    # app (build and run)
    STRIPEPUBLISHABLEKEY=
    BUCKET_FOR_POSTS=
    BUCKET_FOR_TEAM_AVATARS=
    LAMBDA_API_ENDPOINT=
    GA_TRACKING_ID=
    
    请参阅我使用的更新版本,以确保在构建和运行时只发送正确和有效的VAR

    它违反了规则1。从这个问题来看,但我觉得这是一个足够好的折衷方案,因为它不再依赖于其他
    .env
    文件,而这些文件在大多数情况下都可能是开发关键

    不幸的是,如果变量将来发生变化,我们将需要保存compose文件,并且生产构建必须使用相同的
    .env
    文件,但由于这可能在某些CI/CD上进行外部操作,因此不需要太担心


    我发布了这篇文章,但并没有完全结束这个问题,如果其他人能提出更好的想法,我将不胜感激。

    嗯,也许是根文件与(mongo+mongo express)组合的一种变体,并且每个服务都有一个专用的,希望我可以使用变量替换。不,我认为它不会起作用(每个服务单独编写文件)因为如果您查看它,它会说“您必须确保文件中的所有路径都与基本编写文件相关”,这可能意味着它加载的.env文件也与之相关!:(请稍候,.env放在执行docker compose命令的文件夹中(当前工作目录)from和“--项目目录路径指定一个备用工作目录(默认:撰写文件的路径)”from可能允许其他情况!将需要进一步调查:DOption 7。from edit now可能是最明智的选择。否,app/api还支持在每个根目录上都有一个
    .env
    文件(对于开发工作流程),我不想破坏这种行为。我可以通过在Dockerfile上传递
    .env
    文件来解决我的问题,但我觉得这样做不对。因为最终我选择了master.env,我已经加上了你,感谢你的输入:)
      saas-app:
        build:
          args:
            LOG_LEVEL: notice
            NODE_ENV: development
            PORT: '3000'
            BUCKET_FOR_POSTS: xxxxxx
            BUCKET_FOR_TEAM_AVATARS: xxxxxx
            GA_TRACKING_ID: ''
            LAMBDA_API_ENDPOINT: xxxxxxapi
            NODE_ENV: development
            STRIPEPUBLISHABLEKEY: pk_test_xxxxxxxxxxxxxxx
            URL_API: http://api.saas.localhost:8000
            URL_APP: http://app.saas.localhost:3000
          context: /home/pedro/src/opensource/saas-boilerplate/app
        command: yarn start
        container_name: saas-app
        depends_on:
        - saas-api
        environment:
          ...
    
    # compose
    COMPOSE_TAG_NAME=stage
    
    # common to api and app (build and run)
    LOG_LEVEL=notice
    NODE_ENV=development
    URL_APP=http://app.saas.localhost:3000
    URL_API=http://api.saas.localhost:8000
    API_PORT=8000
    APP_PORT=3000
    
    # api (run)
    MONGO_URL=mongodb://saas:secret@saas-mongo:27017/saas
    SESSION_NAME=saas.localhost.sid
    SESSION_SECRET=3NvS3Cr3t!
    COOKIE_DOMAIN=.saas.localhost
    GOOGLE_CLIENTID=
    GOOGLE_CLIENTSECRET=
    AMAZON_ACCESSKEYID=
    AMAZON_SECRETACCESSKEY=
    EMAIL_SUPPORT_FROM_ADDRESS=
    MAILCHIMP_API_KEY=
    MAILCHIMP_REGION=
    MAILCHIMP_SAAS_ALL_LIST_ID=
    STRIPE_TEST_SECRETKEY=
    STRIPE_LIVE_SECRETKEY=
    STRIPE_TEST_PUBLISHABLEKEY=
    STRIPE_LIVE_PUBLISHABLEKEY=
    STRIPE_TEST_PLANID=
    STRIPE_LIVE_PLANID=
    STRIPE_LIVE_ENDPOINTSECRET=
    
    # app (build and run)
    STRIPEPUBLISHABLEKEY=
    BUCKET_FOR_POSTS=
    BUCKET_FOR_TEAM_AVATARS=
    LAMBDA_API_ENDPOINT=
    GA_TRACKING_ID=