所以正如標題所說,我正在嘗試使用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" ]
.

臨摹微笑
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
是要遵循的模式,值將是當前時間
- 2 回答
- 0 關注
- 139 瀏覽
添加回答
舉報
0/150
提交
取消