为什么 docker-compose.yml 环境会覆盖 .env 文件内容?

为什么 docker-compose.yml 环境会覆盖 .env 文件内容?

我有一个使用设置的 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 中的环境变量优先级):

  1. docker compose run -e在命令行上设置使用。
  2. 从你的外壳中替换。
  3. 使用environment撰写文件中的属性进行设置。
  4. --env-file在命令行上使用参数。
  5. env_file在撰写文件中使用该属性。
  6. 使用.env位于项目目录底部的文件进行设置。
  7. 在指令中的容器映像中设置ENV。仅当 ,或没有 Docker Compose 条目时, a 中包含任何ARGENV设置才会进行评估。Dockerfileenvironmentenv_filerun --env

environment这意味着您在撰写文件中设置的环境变量将覆盖.env文件中具有相同名称的任何变量。

另请注意,您可以使用多个撰写文件,稍后在命令行中指定的文件将覆盖之前指定的文件。因此,我们的想法是,该.env文件包含最通用的值(当然,Dockerfile可能包含更多通用值),您稍后可以在一个或多个撰写文件中覆盖这些值。这些更具体的值也可以通过在命令行上给出新值来覆盖(例如,用于一次性部署或测试)。

相关内容