You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker环境变量中设置对象数组(适配application.json)

Got it, let's break down how to move your application.json configs into Docker environment variables so you don't have to rebuild and redeploy your code every time you tweak settings. Here's a step-by-step guide tailored to common scenarios:

Solution Overview

The core idea is twofold: pass your config values as environment variables to your Docker container, then adjust your application to read these variables (either replacing or supplementing the hardcoded application.json).

1. Passing Environment Variables to Docker

You can inject these values in a few clean ways, depending on how you run your container:

Option A: Directly with docker run

If you're using docker run directly, use the -e flag to pass each variable. For nested JSON structures, most frameworks use double underscores (__) to represent nested paths:

docker run -d \
  -e AllowedHosts="*" \
  -e Player__0__Location="Moon" \
  -e Player__0__TipType="Cash" \
  -e Player__0__Duty="manager" \
  -e Player__1__Location="Sun" \
  -e Player__1__TipType="Free" \
  -e Player__1__Duty="Supervisor" \
  your-image-name:tag

Option B: Using a .env file

For better organization, create a .env file to store all your variables:

AllowedHosts=*
Player__0__Location=Moon
Player__0__TipType=Cash
Player__0__Duty=manager
Player__1__Location=Sun
Player__1__TipType=Free
Player__1__Duty=Supervisor

Then run your container with the --env-file flag to load all variables at once:

docker run -d --env-file ./app-config.env your-image-name:tag

Option C: Docker Compose

If you use Docker Compose, add the variables directly to your docker-compose.yml or link a .env file:

version: '3.8'
services:
  your-app:
    image: your-image-name:tag
    environment:
      - AllowedHosts=*
      - Player__0__Location=Moon
      - Player__0__TipType=Cash
      - Player__0__Duty=manager
      - Player__1__Location=Sun
      - Player__1__TipType=Free
      - Player__1__Duty=Supervisor
    # Alternatively, use a .env file:
    # env_file:
    #   - ./app-config.env

2. Making Your App Read the Variables

Next, your application needs to pick up these environment variables. Here's how to do it for popular frameworks:

For .NET Core / .NET 5+

.NET's configuration system automatically prioritizes environment variables over appsettings.json. Just define a config model that matches your JSON structure:

public class PlayerConfig
{
    public string Location { get; set; }
    public string TipType { get; set; }
    public string Duty { get; set; }
}

public class AppConfig
{
    public List<PlayerConfig> Player { get; set; }
    public string AllowedHosts { get; set; }
}

Then inject and use the config in your Program.cs or startup code:

var config = builder.Configuration.Get<AppConfig>();
// Access config.Player[0].Location, config.AllowedHosts, etc.

The framework will automatically map the Player__0__Location style variables to your nested list.

For Spring Boot

Spring Boot uses underscores (or dots) to map environment variables to nested properties. You can set up default values in your application.yml and override them via env vars:

Player:
  - Location: ${PLAYER_0_LOCATION:Moon}
    TipType: ${PLAYER_0_TIPTYPE:Cash}
    Duty: ${PLAYER_0_DUTY:manager}
  - Location: ${PLAYER_1_LOCATION:Sun}
    TipType: ${PLAYER_1_TIPTYPE:Free}
    Duty: ${PLAYER_1_DUTY:Supervisor}
AllowedHosts: ${ALLOWEDHOSTS:*}

Then pass the variables using underscore syntax when running the container:

docker run -d \
  -e ALLOWEDHOSTS="*" \
  -e PLAYER_0_LOCATION="Moon" \
  -e PLAYER_0_TIPTYPE="Cash" \
  -e PLAYER_0_DUTY="manager" \
  -e PLAYER_1_LOCATION="Sun" \
  -e PLAYER_1_TIPTYPE="Free" \
  -e PLAYER_1_DUTY="Supervisor" \
  your-spring-app-image:tag

For Custom/Frameworkless Apps

If you're building a custom app (e.g., Node.js, Python), read the environment variables directly and construct your config object:

// Node.js example
const config = {
  Player: [
    {
      Location: process.env.PLAYER_0_LOCATION || "Moon",
      TipType: process.env.PLAYER_0_TIPTYPE || "Cash",
      Duty: process.env.PLAYER_0_DUTY || "manager"
    },
    {
      Location: process.env.PLAYER_1_LOCATION || "Sun",
      TipType: process.env.PLAYER_1_TIPTYPE || "Free",
      Duty: process.env.PLAYER_1_DUTY || "Supervisor"
    }
  ],
  AllowedHosts: process.env.ALLOWEDHOSTS || "*"
};

3. Best Practices

  • Default Values: Always include fallback values (like your original JSON settings) so your app works if env vars aren't provided.
  • Sensitive Data: If any values are confidential (e.g., API keys), use Docker Secrets or a dedicated secrets manager instead of plain environment variables.
  • Validation: Add config validation in your app to ensure required variables are present and have valid formats.

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:43:13