मैं इस बहुत ही सरल गो पैकेज को स्क्रैच (या न्यूनतम) छवि का उपयोग करके डॉकर कंटेनर में चलाने के लिए चाहता हूं।

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))
}

मेरा मूल डॉकरफाइल इस प्रकार है:

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" को बस बदलने की कोशिश की है, लेकिन ऐसा लगता है कि यह संभावना नहीं है।

साथ ही, मुझे यकीन नहीं है कि यह प्रासंगिक है, लेकिन यह महत्वपूर्ण है कि गो बाइनरी env GOOS=linux GOARCH=arm64 go build के साथ बनाई गई है।

1
michael 4 अक्टूबर 2018, 13:41

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप बाहरी बायनेरिज़ को कॉल करने पर निर्भर हैं, तो आपको यह भी सुनिश्चित करना होगा कि वे स्थिर रूप से संकलित हैं और आपके Dockerfile में शामिल हैं, या आप FROM scratch छवि का उपयोग नहीं कर सकते हैं। केवल बहुत छोटी आधार छवि बेहतर काम कर सकती है।

कई मामलों में आपको जो चाहिए वह करने के लिए एक गो-नेटिव लाइब्रेरी है, और आप देख सकते हैं कि क्या आप बाहरी प्रक्रिया की आवश्यकता नहीं होने के लिए अपना कोड बदल सकते हैं। उदाहरण के लिए, host को बाहरी प्रक्रिया के रूप में कॉल करने के बजाय, आप net.LookupHost के बजाय।

कुछ सामान्य टूल busybox में उपलब्ध हैं (छवि), जिसमें एक nslookup शामिल है, लेकिन एक host या dig नहीं है, लेकिन आमतौर पर ये ऐसी चीजें होती हैं जहां एक -प्रोसेस लाइब्रेरी कॉल बेहतर करेगी। अन्यथा आपको अल्पाइन जैसे हल्के बेस Linux वितरण की आवश्यकता है जहां आप सॉफ़्टवेयर जोड़ें; आपका डॉकरफाइल होगा

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

अल्पाइन आधार छवि स्वयं को केवल 5 एमबी के रूप में विज्ञापित करती है, इसलिए आपकी छवि एक FROM scratch छवि से बड़ी होगी लेकिन फिर भी बड़ी नहीं होगी।

1
David Maze 4 अक्टूबर 2018, 10:52