docker-compose.yml環境が.envファイルの内容を上書きするのはなぜですか?

docker-compose.yml環境が.envファイルの内容を上書きするのはなぜですか?

設定を使用するドッカーコンテナがあり、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エントリが含まれてARGいるか含まれていない場合ENVにのみ評価されます。Dockerfileenvironmentenv_filerun --env

environmentこれは、作成ファイルに設定した環境変数が、ファイル.env内の同じ名前を持つすべての変数をオーバーライドすることを意味します。

また、複数の作成ファイルを使用でき、後でコマンドラインで指定されたファイルは以前に指定されたファイルを上書きします。したがって、このファイルには、後で1つ以上の作成ファイルでオーバーライドできる最も.env一般的な値(もちろんより一般的な値)が含まれているというアイデアです。Dockerfileこれらのより具体的な値は、コマンドラインで新しい値を指定して上書きすることもできます(たとえば、ワンタイム展開またはテスト用)。

関連情報