docker - 尝试在 docker sdk 入口点中使用 $(command)
问题描述
所以正如标题所说,我正在尝试使用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 并失败了。我怎么能执行那些?!
解决方案
与 shell 形式不同,exec 形式不调用命令 shell。这意味着不会发生正常的外壳处理。例如,ENTRYPOINT [ "echo", "$HOME" ]
不会对$HOME
. 如果你想要 shell 处理,那么要么使用 shell 形式,要么直接执行 shell,例如:ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
.
推荐阅读
- android - 无法弄清楚 withIconOffset 是如何工作的
- python - 将滚动窗口添加到熊猫中每一行的列
- javascript - 如何以递归方式编写我的函数?
- character - 占字符搜索之间的空间
- c++ - 对文件中的数字进行冒泡排序,以降序排列第一个数字
- python-xarray - 如何使用xarray选择和总结从开始到结束时间戳的特定时间?
- python - 找不到模块 pyfiglet
- c++ - 在 C++ 中有没有办法像在 python 中那样按名称传递参数?
- javascript - 按空格分割,保留大括号但包含空格
- wildfly - Wildfly 上的 Skyve 不会因 StateTransitionException 而重新启动