2015-03-13 3 views
0

Когда я начинаю демон docker, я изменяю сервер dns так, чтобы в контейнерах был изменен файл /etc/resolv.conf. Глядя на сообщение использования я вижу:аргументы списка командной строки docker

$ 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 ... 

The --dns является то, что я хочу передать, это показывает «список» с [], который после долгих проб и ошибок, я, наконец, получил эту работу:

--dns 127.0.0.1 --dns 8.8.8.8 

которые месторождения:

nameserver 127.0.0.1 
nameserver 8.8.8.8 

в в файл /etc/resolv.conf.

Это правильный способ предоставить список для докеров (и, предположительно, любой программы)?

+4

Это то, как они используют пакет флагов. Многие программы используют флаги для таких параметров списка, как это, но нет причин, по которым они не могут использовать цитируемый список или список с разделителями-запятыми. – JimB

ответ

0

Это способ передачи нескольких аргументов программе в Go, но, конечно, не единственный способ. Это достигается путем определения типа, реализующего интерфейс Value. Пакет flag на flag.Parse() выполняет итерацию списка аргументов, соответствующих имени зарегистрированному Value, и вызывает функцию Set(string) на Value. Вы можете использовать это, чтобы добавить каждое значение данного имени в срез.

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 нет установленного соглашения, и каждое приложение может обеспечить любую реализацию наилучшего соответствия.

Смежные вопросы