Хост, чтобы добавить / usr / bin / host, чтобы очистить Dockerfile, состоящий из двоичного файла Go? - PullRequest
0 голосов
/ 04 октября 2018

Я бы хотел, чтобы этот очень простой пакет Go работал в контейнере Docker с использованием скретч (или минимального) образа.

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := "host"
    args := []string{"-t", "ns", "google.com"}
    output, err := exec.Command(cmd, args...).Output()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(output))
}

Мой оригинальный файл Docker выглядит следующим образом:

FROM scratch
ADD gohost /
CMD ["/gohost"]

Это приводит к exit code 0: exec: "host": executable file not found in $PATH

Я полагаю, это означает, что мне нужно ADD / usr / bin / host и установить ENV на добавленном хосте ... но все случайные комбинации, которые я пробовалэтого не удалось ..

Я также попытался просто изменить cmd := "host", чтобы он указывал на двоичный файл хоста, который я добавил (cmd := "/host"), но, похоже, это тоже невозможно.

Кроме того, я не уверен, что это актуально, но важно, чтобы бинарный файл Go создавался с env GOOS=linux GOARCH=arm64 go build.

1 Ответ

0 голосов
/ 04 октября 2018

Если вы зависите от вызова внешних двоичных файлов, вам также нужно убедиться, что они статически скомпилированы и включены в ваш Dockerfile, или вы не можете использовать образ FROM scratch.Просто очень маленький базовый образ может работать лучше.

Во многих случаях есть библиотека Go-native, которая делает то, что вам нужно, и вы можете увидеть, можете ли вы изменить свой код, чтобы он не нуждался во внешнем процессе.Например, вместо того, чтобы вызывать host как внешний процесс, вместо этого можно вызвать net.LookupHost.

Некоторые общие инструменты доступны в busybox ( image ), включая nslookup, но не host или dig, но обычно это те вещи, где внутрипроцессный вызов библиотеки будет лучше.В противном случае вам понадобится облегченный базовый дистрибутив Linux, такой как alpine , где вы можете добавить программное обеспечение ;ваш Dockerfile будет иметь размер

FROM alpine
RUN apk add bind-tools
COPY gohost /bin
CMD ["gohost"]

Базовое изображение Alpine объявляет себя размером всего 5 МБ, поэтому ваше изображение будет больше, чем FROM scratch изображение, но все равно не будет огромным.

...