我有一个使用设置的 docker 容器docker-compose.yml
,并在其中引入了几个环境变量:
environment:
- AUTH_SECRET=some_secret
然后我的文件中有这些值.env
:
AUTH_SECRET=another_secret
问题是,在我的 Qwik 应用程序中,该.env
文件不会覆盖docker-compose.yml
.
人们会期望更具体项目来覆盖不太具体,更笼统操作系统。
这是我的代码:
import { serverAuth$ } from '@builder.io/qwik-auth'
import type { Provider } from '@auth/core/providers'
import Keycloak from '@auth/core/providers/keycloak'
export const { onRequest, useAuthSession, useAuthSignin, useAuthSignout } = serverAuth$(
({ env }) => ({
secret: env.get("AUTH_SECRET"),
trustHost: true,
callbacks: {
async session({
session,
token,
}){
session.user.guid = token.sub
return session
}
},
providers: [
Keycloak({
clientId: 'Site',
clientSecret: env.get('KEYCLOAK_CLIENT_SECRET') as string,
issuer: env.get('KEYCLOAK_ISSUER') as string
}),
] as Provider[],
})
);
在我的代码中,我得到some_scerent
, 而不是another_secret
.
这种行为是正常的吗?如何在我的特定应用程序中覆盖系统范围的环境变量?
答案1
Docker Compose 中记录的环境变量优先级是这样的(大部分复制自Docker Compose 中的环境变量优先级):
docker compose run -e
在命令行上设置使用。- 从你的外壳中替换。
- 使用
environment
撰写文件中的属性进行设置。 --env-file
在命令行上使用参数。env_file
在撰写文件中使用该属性。- 使用
.env
位于项目目录底部的文件进行设置。 - 在指令中的容器映像中设置
ENV
。仅当 ,或没有 Docker Compose 条目时, a 中包含任何ARG
或ENV
设置才会进行评估。Dockerfile
environment
env_file
run --env
environment
这意味着您在撰写文件中设置的环境变量将覆盖.env
文件中具有相同名称的任何变量。
另请注意,您可以使用多个撰写文件,稍后在命令行中指定的文件将覆盖之前指定的文件。因此,我们的想法是,该.env
文件包含最通用的值(当然,Dockerfile
可能包含更多通用值),您稍后可以在一个或多个撰写文件中覆盖这些值。这些更具体的值也可以通过在命令行上给出新值来覆盖(例如,用于一次性部署或测试)。