当我启动docker守护程序时,我正在修改dns服务器,以便容器具有修改的/etc/resolv.conf。查看用法消息,我看到:
$ docker --help
Usage: docker [OPTIONS] COMMAND [arg...]
A self-sufficient runtime for linux containers.
Options:
--api-enable-cors=false Enable CORS headers in the remote API
-b, --bridge="" Attach containers to a prexisting network bridge
use 'none' to disable container networking
--bip="" Use this CIDR notation address for the network bridge's IP, not compatible with -b
-D, --debug=false Enable debug mode
-d, --daemon=false Enable daemon mode
--dns=[] Force Docker to use specific DNS servers
--dns-search=[] Force Docker to use specific DNS search domains
-e, --exec-driver="native" Force the Docker runtime to use a specific exec driver
... etc ...
--dns是我想传递的,它显示了一个带有[]的'列表',经过多次试验和错误后,我终于让它工作了:
--dns 127.0.0.1 --dns 8.8.8.8
存款:
nameserver 127.0.0.1
nameserver 8.8.8.8
到/etc/resolv.conf文件中。
这是为docker(并且可能是任何go)程序提供列表的正确方法吗?
答案 0 :(得分:0)
这是一种将多个参数传递给Go中的程序的方法,但肯定不是唯一的方法。这是通过定义实现Value
接口的类型来实现的。 flag
上的flag.Parse()
包通过名称与注册的Value
匹配的参数列表进行迭代,并在Value
上调用Set(string)
函数。您可以使用它将给定名称的每个值附加到切片。
type numList []int
func (l *numList) String() string {
return "[]"
}
func (l *numList) Set(value string) error {
number, err := strconv.Atoi(value)
if err != nil {
return fmt.Errorf("Unable to parse number from value \"%s\"", value)
}
*l = append(*l, number)
return nil
}
这种新类型可以注册为标志变量。在以下示例中,应用程序采用n num
个命令行参数,这些参数将转换为整数并添加到列表中。
var numbers numList
func main() {
flag.Var(&numbers, "num", "A number to add to the summation"
flag.Parse()
sum := 0
for _, num := range numbers {
sum += num
}
fmt.Printf("The sum of your flag arguments is %d.\n", sum)
}
这可以通过字符串标志轻松完成,并让用户传递分隔列表。 Go语言中没有既定的约定,每个应用程序都可以提供最适合的任何实现。