You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用根目录单个.env文件为所有Docker服务配置环境变量?

Centralized .env Setup for Your Multi-Service Docker Stack

Absolutely, you can absolutely centralize all your configuration variables into a single root-level .env file—this is actually a best practice for keeping your setup clean and maintainable. Let’s break down how to make this work for your entire stack, including satisfying Laravel’s requirement for its own .env file inside its container:

1. Create a Root-Level .env File

First, create a single .env file in your project root (right next to docker-compose.yml) that holds all configuration variables for every service. You can name variables clearly with prefixes for clarity, or use the exact variable names Laravel expects if that simplifies things.

Example root .env content:

# MySQL Config
MYSQL_ROOT_PASSWORD=your_secure_root_pass
MYSQL_DATABASE=laravel_db
MYSQL_USER=laravel_user
MYSQL_PASSWORD=laravel_db_pass

# Laravel Config (matches Laravel's required .env keys)
APP_NAME=MyApp
APP_ENV=local
APP_KEY=base64:your_generated_app_key_here
DB_CONNECTION=mysql
DB_HOST=mysql # Matches the MySQL service name in docker-compose
DB_PORT=3306
DB_DATABASE=${MYSQL_DATABASE}
DB_USERNAME=${MYSQL_USER}
DB_PASSWORD=${MYSQL_PASSWORD}

# Nuxt/Express Config
NUXT_PORT=3000
EXPRESS_API_URL=http://laravel:8000/api

# Nginx Config
NGINX_PORT=80

2. Configure docker-compose.yml to Use the Root .env

Update your docker-compose.yml to reference this root .env file, and handle Laravel’s specific .env requirement with one of these two straightforward approaches:

Option A: Directly Mount the Root .env to Laravel’s Container

If your root .env uses exact variable names that Laravel expects (like the example above), you can simply mount the root .env file into Laravel’s container at its required path (usually /var/www/html/.env—adjust if your Laravel container uses a different working directory):

services:
  mysql:
    build: ./mysql
    env_file: ./.env # Loads MySQL variables from root .env
    volumes:
      - mysql_data:/var/lib/mysql

  nginx:
    build: ./nginx
    env_file: ./.env
    ports:
      - "${NGINX_PORT}:80"
    depends_on:
      - nuxt-express
      - laravel

  nuxt-express:
    build: ./nuxt-express
    env_file: ./.env
    environment:
      - API_URL=${EXPRESS_API_URL} # Map specific variables if needed
    depends_on:
      - laravel

  laravel:
    build: ./laravel
    env_file: ./.env
    volumes:
      - ./laravel:/var/www/html
      # Mount root .env directly to Laravel's expected path
      - ./.env:/var/www/html/.env
    ports:
      - "8000:8000"
    depends_on:
      - mysql

volumes:
  mysql_data:

This is the simplest approach—Laravel will read the mounted .env file just like it would a local one.

Option B: Generate Laravel’s .env from a Template

If you prefer to use prefixed variables in your root .env (e.g., LARAVEL_APP_KEY instead of APP_KEY), you can use a template file and a startup script to generate Laravel’s .env dynamically when the container starts.

  1. Create a .env.template file in your local Laravel directory:
APP_NAME=${LARAVEL_APP_NAME}
APP_ENV=${LARAVEL_APP_ENV}
APP_KEY=${LARAVEL_APP_KEY}
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=${MYSQL_DATABASE}
DB_USERNAME=${MYSQL_USER}
DB_PASSWORD=${MYSQL_PASSWORD}
  1. Update your Laravel service in docker-compose.yml to use envsubst (a tool that replaces environment variables in text files) to generate the .env on startup:
laravel:
  build: ./laravel
  env_file: ./.env
  volumes:
    - ./laravel:/var/www/html
  entrypoint: ["/bin/sh", "-c", "envsubst < /var/www/html/.env.template > /var/www/html/.env && php artisan serve --host=0.0.0.0"]
  depends_on:
    - mysql

Note: If your Laravel image uses Alpine Linux, you’ll need to install gettext (which includes envsubst) in your Laravel Dockerfile:

RUN apk add --no-cache gettext

3. Key Notes for Success

  • Gitignore the root .env: Add .env to your .gitignore file to avoid committing sensitive credentials to version control.
  • Consistent variable names: Make sure variables shared between services (like MySQL credentials) match across the root .env and Laravel’s configuration.
  • Service names as hosts: Use Docker service names (e.g., mysql) as hostnames in your config—Docker’s internal DNS will resolve these to the correct containers.

内容的提问来源于stack exchange,提问作者Roman Khegay

火山引擎 最新活动