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
文件合并到单个根目录中,或在多个文件上复制变量docker compose build--build arg GA_TRACKING_ID=UA-xXxXXXX-X
)上推断它们.env
文件,因为它感觉不正确和/或不安全build
options功能请求中的args\u文件是有效的,您是否也这么说
.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=