2017-05-11 38 views
6

Używam kontenera w Google Container Engine. Wewnątrz tego kontenera mam trochę kodu Pythona, który próbuje odczytać obiekt typu blob z zasobnika hostowanego o Google Cloud Storage.Blob download_as_string Błąd SSL w Google Container Engine

Kod jest tak proste, jak:

from google.cloud import storage 

gs = storage.Client(project="my-shiny-project") 
gc_bucket = gs.get_bucket("my-bucket") 
blob = gc_bucket.get_blob("my-blob") 
print blob.download_as_string() 

Powyższy kod działa dobrze na moim komputerze lokalnym. Jednak gdy uruchomię to w kontenerze Docker na GKE, część do góry do utworzenia obiektu blob działa dobrze. Jednak wywołanie download_as_string kończy się niepowodzeniem z:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/site-packages/google/cloud/storage/blob.py", line 453, in download_as_string 
    self.download_to_file(string_buffer, client=client) 
    File "/usr/lib/python2.7/site-packages/google/cloud/storage/blob.py", line 412, in download_to_file 
    self._do_download(transport, file_obj, download_url, headers) 
    File "/usr/lib/python2.7/site-packages/google/cloud/storage/blob.py", line 363, in _do_download 
    response = download.consume(transport) 
    File "/usr/lib/python2.7/site-packages/google/resumable_media/download.py", line 136, in consume 
    transport, u'GET', self.media_url, headers=headers) 
    File "/usr/lib/python2.7/site-packages/google/resumable_media/_helpers.py", line 134, in http_request 
    return transport.request(method, url, data=data, headers=headers) 
    File "/usr/lib/python2.7/site-packages/google/auth/transport/requests.py", line 179, in request 
    method, url, data=data, headers=request_headers, **kwargs) 
    File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 468, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 576, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 447, in send 
    raise SSLError(e, request=request) 
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) 

Jakieś pomysły, dlaczego to się stało?

FWIW, Próbowałem innych operacji na obiekcie blob, takich jak pobranie identyfikatora, typ zawartości, rozmiar itp. Operacje te działały dobrze. Nawet metoda exist() tego obiektu działała poprawnie (co prawdopodobnie miało rzeczywiste żądanie HEAD obiektu).

Używam obrazu pojemnika "alpejski 3.5". Python jest wersja "Python 2.7.13 (domyślnie, 22 grudnia 2016, 09:22:15)"

[EDIT]

Zmieniłem obraz do 'debian: Jessie' a kod pracował dobrze. Pakiety openssl na tych obrazach mają różne wersje. Wygląda na to, że ma jakiś efekt. Nadal dobrze byłoby wiedzieć dokładnie, na czym polega problem.

+0

Ten sam błąd tutaj, staramy się przesyłać obrazy Opencv oparte na Ubuntu, które z Ubuntu zabierają ponad 7 GB rozmiaru do Alpine Linux, który ma zaledwie jeden GB, problem, który mamy, to problemy z SSL, już próbowaliśmy zainstalować 'ca- certificate' i 'java-cacerts' i uruchomić' update-ca-certificates', bez powodzenia, czy mógłbyś wreszcie przezwyciężyć błąd w Alpine3.5? – danigosa

Odpowiedz

1

I dowiedzieć się, musiałem dodać do Dockerfile:

# Base Stuff 
RUN apk add --update \ 
openjdk8-jre \ 
ca-certificates \ 
java-cacerts \ 
libre2 \ 
libre2-dev \ 
gcc \ 
build-base \ 
linux-headers \ 
musl-dev \ 
python3-dev \ 
make \ 
openssl \ 
openssl-dev \ 
py3-openssl \ 
libffi \ 
libffi-dev \ 
openssh \ 
openssh-client \ 
python3-dev 

RUN update-ca-certificates && gcloud -q components install gsutil 

I to sprawiło, że podstęp.