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

如何让Dockerfile使用Golang Docker客户端传递的环境变量?

问题描述

我正在使用Golang版Docker客户端,以下脚本尝试在容器启动时传递环境变量:

package main

import (
    "context"
    "fmt"
    "os/user"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/api/types/container"
    "github.com/docker/docker/client"
)

func main() {
    dockerClient, _ := client.NewClientWithOpts(client.FromEnv)
    env := []string{}

    for key, value := range map[string]string{"hi": "hoo"} {
        env = append(env, fmt.Sprintf("%s=%s", key, value))
    }

    user, err := user.Current()
    if err != nil {
        fmt.Println(err)
    }

    config := container.Config{
        User:  fmt.Sprintf("%s:%s", user.Uid, user.Gid),
        Image: "675d8442a90f",
        Env:   env,
    }

    response, err := dockerClient.ContainerCreate(context.Background(), &config, nil, nil, nil, "")
    if err != nil {
        fmt.Println(err)
    }

    if err = dockerClient.ContainerStart(context.Background(), response.ID, types.ContainerStartOptions{}); err != nil {
        fmt.Println(err)
    }

}

我的Dockerfile很简单,尝试输出hi环境变量:

# Filename: Dockerfile 
FROM ubuntu:latest
COPY . .
CMD ["echo", "$hi"]

构建镜像并将其ID传入脚本后,容器并未输出该变量值。请问如何让Dockerfile使用Golang Docker客户端传递给容器的环境变量?

解决方案

你的Go客户端代码传递环境变量的逻辑是正确的,问题出在Dockerfile的CMD格式上:exec格式的CMD不会启动shell,因此无法解析$hi这类环境变量引用。可以通过两种方式解决:

方法1:改用shell格式CMD

直接使用shell模式的CMD,Docker会自动启动/bin/sh -c来执行命令,此时环境变量会被正常解析:

CMD echo $hi

方法2:显式调用shell处理变量

如果需要保留exec格式的CMD,可以显式调用shell来执行命令,确保环境变量被解析:

CMD ["sh", "-c", "echo $hi"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:55:16