如何让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
相关产品推荐
相关产品推荐

