2015-02-23 5 views
11

के साथ एडीडी/सीओपीवाई फाइलें मैं अपनी डॉकर छवि बनाने के लिए एसबीटी-नेटिव-पैकर 1.0.0-एम 5 का उपयोग कर रहा हूं। मुझे एक ऐसी फ़ाइल जोड़ने की ज़रूरत है जो स्रोत फ़ाइल या संसाधन फ़ोल्डर में न हो। msg="test.txt: no such file or directory"एसडीटी-नेटिव-पैकर के डॉकर समर्थन

तो थोड़ा चारों ओर से खुदाई के बाद यह मैं target/docker/stage में test.txt की आवश्यकता है लगता है:

dockerCommands := Seq(
    Cmd("FROM", "myrepo/myImage:1.0.0"), 
    Cmd("COPY", "test.txt keys/"), // <-- The failing part 
    Cmd("WORKDIR", "/opt/docker"), 
    Cmd("RUN", "[\"chown\", \"-R\", \"daemon\", \".\"]"), 
    Cmd("USER", "daemon"), 
    ExecCmd("CMD", "echo", "Hello, World from Docker") 
) 

यह साथ विफल: मेरी डोकर आदेशों इस प्रकार हैं। फिर यह काम करता है। लेकिन मैं इसे स्वचालित रूप से कैसे प्राप्त करूं? फ़ाइल वास्तव में परियोजना के मूल फ़ोल्डर में है।

+1

मैं भी यह सोच रहा हूं। मैं आपको बता सकता हूं कि इसे मैपिंग के रूप में जोड़ना ('डॉकर में मैपिंग्स' या 'डॉकर में डॉकर पैकेजिंग मैपिंग्स') काम नहीं करता है, इसके बावजूद [ऐसा लगता है कि काम करना चाहिए] (https://github.com/sbt/sbt-native- बंडल/ब्लॉब/मास्टर/src/मुख्य/स्केला/com/typesafe/एसबीटी/बंडल/डोकर/DockerPlugin.scala # L94)। – 2rs2ts

उत्तर

10

मैं फ़ाइल को mappings in Universal पर जोड़कर काम करने में कामयाब रहा।

mappings in Universal += file("test.txt") -> "keys/test.txt" 

आप यदि आप ऐसा करते COPY आदेश की जरूरत नहीं होगी, वैसे: आप के लिए तो, आप कुछ इस तरह की आवश्यकता होगी।

अब, मुझे यकीन नहीं है कि यह इस मैपिंग को अन्य एसबीटी-देशी-पैकर प्लगइन में जोड़ने जा रहा है या नहीं। मुझे आशा है कि एक टिप्पणीकर्ता मुझे बता सकता है कि यह सच है या नहीं, लेकिन मेरा अंतर्ज्ञान यह है कि ऐसा होगा, जो आपके लिए एक डीलरब्रेकर हो सकता है। लेकिन कोई कामकाज किसी से भी बेहतर नहीं है, है ना? आप Build.scala का उपयोग करते हैं तो आप शायद एक वीएम तर्क इस्तेमाल कर सकते हैं इस मानचित्रण जोड़ने के लिए sbt या नहीं, यह बताने के लिए ...

+0

मैं इस तरह से डॉकर कार्यशील निर्देशिका में फ़ाइलों को रखने में सक्षम हूं, लेकिन दुर्भाग्य से रूट में। यानी "/test.txt" में मैपिंग से पहले की स्लैश अनदेखा हो रही है। – akauppi

+0

आप उस फ़ाइल को स्थानांतरित करने के लिए एक और कमांड चला सकते हैं जहां आप चाहते हैं: डॉकर कमांड + = एक्सेकसीएमडी ("रन", "एमवी", एस "$ {(डॉकर में डिफॉल्ट लिनक्स इंस्टाललोकेशन) .value} /keys/test.txt", "/wherever/you/want/test.txt") – radek1st

0

मैं फ़ाइलों को इस तरह से जोड़ने के लिए सक्षम था:

उदाहरण के लिए, में स्थित एक फ़ाइल जोड़ने के लिए

dockerPackageMappings in Docker += (baseDirectory.value/"docker"/"ssh_config") -> "ssh_config" 

dockerCommands := (dockerCommands.value match { 
    case Seq([email protected]("FROM", _), [email protected]_*) => 
    Seq(
    from, 
    Cmd("Add", "ssh_config", "/sbin/.ssh/config") 
) ++ rest 
}) 
+1

दुर्भाग्य से, यह एसबीटी-डॉकर प्लगइन का समाधान है, एसबीटी-नेटिव-पैकर के लिए नहीं। – mzywiol

+1

वैसे यह मेरी मदद करता है, क्योंकि मैं एसबीटी-डॉकर के लिए समाधान ढूंढने की कोशिश कर रहा था और Google ने मुझे यहां लाया। :) –

1

मैं dockerPackageMappings उपयोग करते हुए इस काम के प्राप्त करने में सक्षम था ईफ़ोल्डर में सभी अतिरिक्त फाइलें (जो कंटेनर छवि में शामिल होनी चाहिए)। उस फ़ोल्डर की सामग्री स्वचालित रूप से आपके कंटेनर छवि के भीतर /opt/app फ़ोल्डर में कॉपी की जाएगी। आपको किसी भी अतिरिक्त विन्यास की आवश्यकता नहीं है। अतिरिक्त जानकारी के लिए "Getting started with Universal Packaging" देखें।

2

आप plac हो सकता है: src/main/resources/docker/some-file.ext

dockerfile in docker := { 
    val targetPath = "/usr/app" 

    // map of (relativeName -> File) of all files in resources/docker dir, for convenience 
    val dockerFiles = { 
    val resources = (unmanagedResources in Runtime).value 
    val dockerFilesDir = resources.find(_.getPath.endsWith("/docker")).get 
    resources.filter(_.getPath.contains("/docker/")).map(r => dockerFilesDir.toURI.relativize(r.toURI).getPath -> r).toMap 
    } 

    new Dockerfile { 
    from(s"$namespace/$baseImageName:$baseImageTag") 
    ... 
    add(dockerFiles("some-file.ext"), s"$targetPath/some-file.ext") 
    ... 
    } 
}