为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
SMILET 2022-06-13 16:22:55
所以正如标题所说,我正在尝试使用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'}使用 backqoute 并失败了。我怎么能执行那些?!
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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



查看完整回答
反对 回复 2022-06-13
?
临摹微笑

TA贡献1982条经验 获得超2个赞

RunBatch将按字面意思对待价值entrypoint(正如你所经历的那样)。

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

也许:

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

注意15:04:05是要遵循的模式,值将是当前时间


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号