2016-05-18 6 views
1

Dies schlägt fehl, wenn ich es in einem Docker-Container ausführen, aber funktioniert, wenn ich es innerhalb eines virtualenv in OS X ausführen. Eine Idee, was könnte schief gehen? Gibt es bekannte Probleme mit Docker + Boto?Herunterladen der Datei von S3 mit Boto3 in Docker schlägt fehl

>>> import boto3                             
>>> s3 = boto3.client('s3')                           
>>> s3.download_file("mybucket", "myfile.txt", "myfile2.txt")                 
Traceback (most recent call last):                         
    File "<stdin>", line 1, in <module>                        
    File "/opt/conda/lib/python2.7/site-packages/boto3/s3/inject.py", line 104, in download_file          
    extra_args=ExtraArgs, callback=Callback)                      
    File "/opt/conda/lib/python2.7/site-packages/boto3/s3/transfer.py", line 666, in download_file         
    object_size = self._object_size(bucket, key, extra_args)                  
    File "/opt/conda/lib/python2.7/site-packages/boto3/s3/transfer.py", line 729, in _object_size          
    Bucket=bucket, Key=key, **extra_args)['ContentLength']                   
    File "/opt/conda/lib/python2.7/site-packages/botocore/client.py", line 258, in _api_call           
    return self._make_api_call(operation_name, kwargs)                    
    File "/opt/conda/lib/python2.7/site-packages/botocore/client.py", line 548, in _make_api_call          
    raise ClientError(parsed_response, operation_name)                    
botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden       

Antwort

0

Ich denke, Sie setzen nicht die richtigen Umgebungsvariablen. Verwenden Sie env, um zu überprüfen, was auf Ihrem Host festgelegt ist, und setzen Sie ähnliche Variablen innerhalb des Containers, oder übergeben Sie sie mit -e an docker run.

Bearbeiten: Da Sie in Ihren Kommentaren angegeben haben, dass Sie eine Credentials-Datei verwenden, übergeben Sie diese in den Container mit -v ~/.aws/credentials:/root/.aws/credentials. Dies setzt voraus, dass ein richtiger HOME eingestellt ist und Sie den root Benutzer verwenden. Einige Bilder haben dies nicht getan, und Sie müssen es möglicherweise in den Stammordner unter /.aws/credentials legen. Wenn Sie einen bestimmten Benutzer haben, muss sich der Pfad in seinem Benutzerordner befinden.

+0

Ich bin Verwenden einer Berechtigungsdatei (~/.aws/credentials) anstelle von Umgebungsvariablen. –

+0

Dann übergeben Sie es in den Container mit '-v ~/.aws/credentials:/root/.aws/credentials'. – ZeissS

+0

Es ist bereits im Container. Soll Boto nicht davon lesen? –

1

Blick auf die Fehler: An error occurred (403) when calling the HeadObject operation: Forbidden

Es fand die Anmeldeinformationen, aber es hatte keine Erlaubnis, den Eimer zuzugreifen. Bottom line: Aktualisieren Sie Ihre IAM-Berechtigungen so, dass sie die Berechtigung s3:ListBucket für Ihren Bucket enthalten: arn:aws:s3:::mybucket/* oder fügen Sie einfach die Richtlinie AmazonS3ReadOnlyAccess Ihrem IAM-Benutzer/Ihrer IAM-Rolle bei.

Sie können dies versuchen und sehen es die richtigen Anmeldeinformationen druckt:

>>> import botocore.session 
>>> session = botocore.session.get_session() 

>>> session.get_credentials().access_key 
'AKIAABCDEF6RWSGI234Q' 

>>> session.get_credentials().secret_key 
'abcdefghijkl+123456789+qbcd' 
+0

Ok, das half mir, Probleme mit den Anmeldeinformationen auszuschließen, was großartig ist. Glauben Sie, dass es für Docker-Benutzer bestimmte IAM-Rollen gibt? –

+0

Es hat nichts mit Docker zu tun. Wenn die Anmeldeinformationen auf dem Mac funktionieren, sollte es auch auf Docker funktionieren. Meine Vermutung ist, dass die Anmeldeinformationen unterschiedlich sind. Verwenden Sie das Code-Snippet, das ich gepostet habe, und prüfen Sie, ob auf Mac und Docker dieselben Anmeldeinformationen angezeigt werden. – helloV

+0

Es sind die gleichen genauen Anmeldeinformationen. :( –

0

Was für mich das Problem behoben war auf dem Behälter zu installieren awscli und Update boto3> 1,4

pip install awscli 
pip install --upgrade boto3