尝试在 docker sdk 入口点内使用 $(command)

trying to use $(command) inside docker sdk entrypoint

正如标题所说,我正在尝试使用 golang docker sdk(docker api)在入口点内执行一个简单的命令。

func RunBatch(imageName, containerName string, entrypoint []string, volumes []string) string {
    ctx := context.Background()
    c := getClient()

    cfg := &container.Config{Entrypoint: entrypoint, Tty: true, Image: imageName}
    hostCfg := &container.HostConfig{Mounts: make([]mount.Mount, len(volumes))}
    netCfg := &network.NetworkingConfig{}
    startCfg := types.ContainerStartOptions{}

    for i := range volumes {
        vols := strings.Split(volumes[i], ":")

        hostCfg.Mounts[i] = mount.Mount{
            Type:   mount.TypeBind,
            Source: config.Config.BaseDir + vols[0],
            Target: vols[1],
        }
    }

    resp, err := c.ContainerCreate(ctx, cfg, hostCfg, netCfg, containerName)
    if err != nil {
        log.Fatal().Err(err)
    }

    err = c.ContainerStart(ctx, resp.ID, startCfg)
    if err != nil {
        log.Fatal().Err(err)
    }

    _, err = c.ContainerWait(ctx, resp.ID)
    if err != nil {
        log.Fatal().Err(err)
    }

    err = c.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{})
    if err != nil {
        log.Fatal().Err(err)
    }

    return resp.ID
}

我在这里经过的入口点是 ["touch", "/app/$(date +'%T')"] 但是创建的文件看起来像 $(date +'%T'),我也尝试过 ${date +'%T'} 和反引号都失败了。 我怎样才能执行这些?!

与 shell 形式不同,exec 形式不调用命令 shell。这意味着正常的 shell 处理不会发生。例如,ENTRYPOINT [ "echo", "$HOME" ] 不会对 $HOME 进行变量替换。如果您想要 shell 处理,那么要么使用 shell 形式,要么直接执行 shell,例如:ENTRYPOINT [ "sh", "-c", "echo $HOME" ].

RunBatch 将按字面意义处理 entrypoint 的值(如您所见)。

您需要为其提供 Golang 等价物(Time.Format 值(bash's)$(date +%T) 才能成功:

也许:

["touch", fmt.Sprintf("/app/%s",time.Now().Format("15:04:05"))]

NOTE the 15:04:05 is the pattern to follow, the value will be the current time