2017-06-23 6 views
12

मैं अमेज़ॅन लोचदार कंटेनर सेवा के माध्यम से जंग और रॉकेट के माध्यम से एक एपीआई प्रदान कर रहा हूं। जब भी मैं अमेज़न S3 के लिए रखा या वस्तुओं मिलता है, यह स्थानीय स्तर पर अच्छा काम करता है, लेकिन अगर अमेज़न ईसीएस पर तैनात है, मैं इस रन-टाइम त्रुटि हो रही है:डॉकर और "ओपनएसएसएल लाइब्रेरी ने एक त्रुटि की सूचना दी" जब तैनात

HttpDispatch(HttpDispatchError { message: "The OpenSSL library reported an error" }) 

यह भी होता है जब मैं पर डोकर छवि चलाने मेरी मशीन।

use super::types::SomeCustomType; 
use rusoto_core::{DefaultCredentialsProvider, Region, default_tls_client}; 
use rusoto_s3::{S3, S3Client, GetObjectRequest}; 

pub fn load_data_from_s3(object_name: String) -> SomeCustomType { 
    let credentials = DefaultCredentialsProvider::new().unwrap(); 
    let client = S3Client::new(default_tls_client().unwrap(), credentials, Region::UsWest2); 
    let mut request = GetObjectRequest::default(); 
    request.bucket = "bucket-name".to_string(); 
    request.key = object_name.to_string(); 
    match client.get_object(&request) { 
     // *** This is going to fail in docker container on run-time *** 
     Ok(file) => { 
      // this part is actually not important for this example, 
      // so code has been omitted 
      someCustomType 
     } 
     Err(e) => { 
      println!("{:?}", e); // *** errors out here! *** 
      SomeCustomType::default() 
     } 
    } 
} 

Cargo.toml

[dependencies] 
brotli="1.0.8" 
chrono = "0.3.1" 
fnv = "1.0.5" 
rusted_cypher = "1.1.0" 
rocket = { git = "https://github.com/SergioBenitez/Rocket", rev = "614297eb9bc8fa5d9c54f653dc35b8cc3a22891f" } 
rocket_codegen = { git = "https://github.com/SergioBenitez/Rocket", rev = "614297eb9bc8fa5d9c54f653dc35b8cc3a22891f" } 
rocket_contrib = { git = "https://github.com/SergioBenitez/Rocket", rev = "614297eb9bc8fa5d9c54f653dc35b8cc3a22891f" } 
rusoto_core = "0.25.0" 
rusoto_s3 = "0.25.0" 
serde = "1.0.8" 
serde_json = "1.0.2" 
serde_derive = "1.0.8" 

यह कैसे मैं MacOS पर डोकर छवि का निर्माण है:

cargo clean && 
docker run -v $PWD:/volume -w /volume -t manonthemat/muslrust cargo build --release && 
docker build -t dockerimagename . 

मैं कहाँ त्रुटि हो रहा है टिप्पणी जोड़ दिया है

डॉकर छवि मैनंटम at/muslrust अनिवार्य रूप से क्लक्स/muslrust है। मुझे अपनी खुद की छवि बनाना पड़ा क्योंकि मुझे हाल ही में जंग का निर्माण करने की आवश्यकता थी।

यह (सरलीकृत) Dockerfile जो है अब तक मेरे लिए महान काम कर रहा है:

FROM scratch 
ADD target/x86_64-unknown-linux-musl/release/project/
CMD ["/project"] 

चीजें मैं समस्या को हल करने की कोशिश की है में से कुछ ....

  1. openssl = "0.9.14" को Cargo.toml में जोड़ा गया।

  2. इस के लिए मेरे Dockerfile बदलें:

    FROM alpine:edge 
    
    ADD target/x86_64-unknown-linux-musl/release/project/ 
    RUN apk add --no-cache curl perl openssl-dev ca-certificates linux-headers build-base zsh 
    
    CMD ["/project"] 
    

    यह भी कुछ भी परिवर्तन नहीं किया है, लेकिन मेरे अंदर देखने के लिए कुछ और विकल्प दे दी है।

  3. मैं इस के लिए cargo clean के बाद पार संकलन कदम बदल दिया है:

    docker run -v $PWD:/volume -w /volume -e RUST_LOG="rusoto,hyper=debug" -e OPENSSL_STATIC=1 -e OPENSSL_DIR=/usr/local -t manonthemat/muslrust cargo build --release --features "logging" 
    

    के बाद नई डोकर छवियों बनाया गया था, एक खोल पाने:

    docker run -i -e ROCKET_ENV=prod -e ROCKET_ADDRESS=0.0.0.0 -e RUST_LOG="rusoto,hyper=debug" dockerimagename /bin/zsh 
    

    वहाँ मैं उपलब्ध कराने के द्वारा अपने प्रोजेक्ट को मार डाला एसएसएल प्रमाणपत्रों का एक अलग पथ जो कि किसी भी अलग प्रभाव के साथ मौजूद नहीं है।

    अगले समय में, मैं इसे एक अलग रास्ता को इंगित करने के लिए सेट: SSL_CERT_DIR=/etc/ssl/certs /project और मैं एक दिलचस्प परिणाम मिला, जब client.get_object(&request) कॉल की त्रुटि को प्रिंट:

    Unknown("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>... 
    
  4. मैं साथ rusoto प्रतिस्थापित एडब्ल्यूएस-sdk-जंग टोकरा

thread 'main' panicked at 'Error dispatching request: HttpDispatchError { message: "the handshake failed" }', /checkout/src/libcore/result.rs:860   stack backtrace: 
    0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace                           at ./checkout/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:49 
    1: std::sys_common::backtrace::_print                                 at ./checkout/src/libstd/sys_common/backtrace.rs:71 
    2: std::panicking::default_hook::{{closure}}                               at ./checkout/src/libstd/sys_common/backtrace.rs:60 
       at ./checkout/src/libstd/panicking.rs:355 
    3: std::panicking::default_hook 
       at ./checkout/src/libstd/panicking.rs:371 
    4: std::panicking::rust_panic_with_hook 
      at ./checkout/src/libstd/panicking.rs:549 
    5: std::panicking::begin_panic 
      at ./checkout/src/libstd/panicking.rs:511 
    6: std::panicking::begin_panic_fmt 
      at ./checkout/src/libstd/panicking.rs:495 
    7: rust_begin_unwind 
      at ./checkout/src/libstd/panicking.rs:471 
    8: core::panicking::panic_fmt 
      at ./checkout/src/libcore/panicking.rs:69 
    9: core::result::unwrap_failed 
    10: <aws_sdk_rust::aws::s3::s3client::S3Client<P, D>>::get_object 
    11: himitsu::ingest::load_data_from_s3 
    12: himitsu::ingest::load_data 
    13: himitsu::main 
    14: __rust_maybe_catch_panic 
      at ./checkout/src/libpanic_unwind/lib.rs:98 
    15: std::rt::lang_start 
      at ./checkout/src/libstd/panicking.rs:433 
      at ./checkout/src/libstd/panic.rs:361 
      at ./checkout/src/libstd/rt.rs:59 
  1. मैं जमाना मेरे मैक पर वर्चुअलबॉक्स के माध्यम से एक लिनक्स वितरण का नेतृत्व किया, अद्यतन पुस्तकालयों, ओपनएसएसएल हेडर और जंग स्थापित किया, फिर परियोजना आयात की। अब मुझे तुरंत हस्ताक्षरDoesNotMatch त्रुटि मिल रही है। मैंने सत्यापित किया कि मैं होस्ट मशीन के वीपीएन के माध्यम से https के माध्यम से एक नियो 4j सर्वर तक पहुंच सकता हूं, इसलिए एसएसएल कम से कम भागों में काम करता प्रतीत होता है।

  2. संकलन और अमेज़न ईसीएस-अनुकूलित अमेज़न लिनक्स एएमआई 2017.03.a कार्यों पर परियोजना चल रहा है। डॉकर छवि कार्यों का निर्माण भी। के रूप में यह standard_init_linux.go:178: exec user process caused "no such file or directory" साथ देता है, भले ही फ़ाइल नहीं है, सही अनुमतियां हैं, यह आदि पर अन्य कार्यों चला सकते हैं ... बस इसे क्रियान्वित नहीं कि इस प्रणाली के भीतर से डोकर छवि चल रहा है, ऐसा नहीं करता। यह भी मामला है जब पिछले राज्य में वापस रोलिंग है जिसमें कोई S3/OpenSSL निर्भरता नहीं है। यह scratch और alpine आधार छवियों के लिए सच है। लेकिन, अगर मैं ubuntu आधार छवि के रूप में साथ डोकर छवि का निर्माण, मैं पूर्व S3/OpenSSL संस्करण का प्रदर्शन शुरू। रुसूटो के साथ संस्करण के लिए, ओपनएसएसएल लाइब्रेरी और उसके हेडर इंस्टॉल करते समय भी मुझे ओपनएसएसएल त्रुटि मिल जाएगी।

  3. अपने Mac पर डोकर छवि संकलित, निजी रेपो को धक्का दे हब डोकर करने के लिए। ईसी 2 इंस्टेंस पर एसएसएच सत्र के माध्यम से उस डॉकर छवि को खींच लिया (6 में से एक जैसा)। अब यह चल रहा है मुझे "ऐसी कोई फ़ाइल या निर्देशिका" 6 में के रूप में त्रुटि है, लेकिन अच्छा ol 'HttpDispatch(HttpDispatchError { message: "The OpenSSL library reported an error" }) नहीं देता है (अब भी जब SSL_CERTS_DIR =/etc/ssl/कंटेनर के वातावरण में प्रमाणपत्र गुजर)

+0

प्लस वन। कुछ कोड के साथ एक डॉकर सवाल! – jww

उत्तर

3

ये कदम मैं एडब्ल्यूएस पर तैनाती काम करने के लिए लिया है कर रहे हैं।

मुझे यकीन है कि वहाँ इस अनुकूलन करने के लिए तरीके हैं और मैं इस पोस्ट के रूप में मैं इस प्रक्रिया के बारे में और जानेंगे संपादित करेंगे हूँ, लेकिन मैं इन चरणों का लिया है कर रहे हैं।

  1. मैं MacOS पर द्विआधारी बनाया:

    docker run -v $PWD:/volume -w /volume -e RUST_LOG="rusoto,hyper=debug" -e OPENSSL_STATIC=1 -e OPENSSL_DIR=/usr/local -e SSL_CERT_DIR=/etc/ssl/certs -t manonthemat/muslrust cargo build --release --features "logging"

  2. मैं संशोधित Dockerfile

    FROM alpine:edge COPY target/x86_64-unknown-linux-musl/release/project/ RUN apk update && apk add --no-cache pkgconfig openssl-dev ca-certificates linux-headers && update-ca-certificates CMD [ "/project" ]

  3. मैं डोकर छवि का निर्माण किया

    • मैंने फिर डॉकर छवि को एक निजी रेपो में धक्का दिया और परीक्षण के लिए ईसी 2 उदाहरण पर एसएसएच-सत्र के माध्यम से इसे खींच लिया। मैं docker run -e SSL_CERT_DIR=/etc/ssl/certs secretuser/secretrepo:notsosecrettag
  4. मेरे द्वारा टैग के माध्यम से इसे सफलतापूर्वक भाग गया और एडब्ल्यूएस भंडार

  5. को डोकर छवि को धक्का दिया पर अमेज़न लचीला कंटेनर सेवा एक सफल रन के लिए, मैं काम परिभाषा को संशोधित करने के लिए किया था। containerDefinitions में मैं स्मृति अप करने के लिए था और पर्यावरण सरणी में जोड़ें: कुछ अज्ञात और शायद असंबंधित कारण मैं भी EC2 उदाहरणों पर एजेंट को अद्यतन करने और फिर उन को पुनः आरंभ किया था के लिए

    `{ 
        "name": "SSL_CERT_DIR", 
        "value": "/etc/ssl/certs" 
    }` 
    
-1

छवि

की तरह में

update-ca-certificates चलाने की कोशिश:

FROM scratch 
ADD target/x86_64-unknown-linux-musl/release/project/
RUN update-ca-certificates 
CMD ["/project"] 
+0

किस चरण में? 'फ्रॉम स्क्रैच' का उपयोग करके मूल दृष्टिकोण के लिए, इसके लिए कोई जगह नहीं है, क्योंकि कोई '/ bin/sh' नहीं है जो 'अपडेट-सीए-प्रमाणपत्र' निष्पादित भी कर सकता है। यदि प्लग इन किया गया है तो अल्पाइन से निर्मित डॉकर छवि कहें, फिर 'अपडेट-सीए-सर्टिफिकेट्स' चलाने के लिए अभी भी 'standard_init_linux.go: 178: निष्पादन उपयोगकर्ता प्रक्रिया के कारण कुछ भी नहीं है" ऐसी कोई फ़ाइल या निर्देशिका नहीं है "त्रुटि I मैं मिल रहा हूँ – manonthemat

+0

आप स्क्रिप्ट चलाने से पहले हमेशा चरण जोड़ सकते हैं। – MrE

+0

खरोंच से छवियों आप अपने आप को निर्माण, परतों हटना, डिबग करने के लिए आप origonal छवि – MrE

संबंधित मुद्दे