簡體   English   中英

使用boto3從docker容器內部連接到DynamoDB Local

[英]Connect to DynamoDB Local from inside docker container with boto3

為了進行測試,我嘗試從docker內部運行python 3.4應用程序,並連接到DynamoDB Local實例。 我可以從主機訪問DynamoDB Local,而不會出現問題。

但是,當從Docker容器中擊中它時,出現“連接被拒絕錯誤”。 我嘗試在容器中本地運行DynamoDB,並將其鏈接到應用程序的docker容器,然后在主機上運行。 一種猜測是缺少一些環境變量,但我無法弄清楚。 我無助於將~/.aws目錄鏈接為一個卷。

這是一些重現該錯誤的測試代碼:

import boto3

print('creating dynamodb resource')

dynamodb = boto3.resource(
    'dynamodb',
    endpoint_url='http://localhost:8001',
    region_name='dummy_region',
    aws_access_key_id='dummy_access_key',
    aws_secret_access_key='dummy_secret_key',
    verify=False)

print ('got resource:', dynamodb)

print('adding table')

result = dynamodb.create_table(
    TableName='foo',
        KeySchema=[
            {
                'AttributeName': 'from_email',
                'KeyType': 'HASH'  # Partition key
            },
            {
                'AttributeName': 'raw_id',
                'KeyType': 'RANGE'  # Sort key
            },
        ],
        AttributeDefinitions=[
            {
                'AttributeName': 'from_email',
                'AttributeType': 'S'
            },
            {
                'AttributeName': 'raw_id',
                'AttributeType': 'N'
            },
        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 10,
            'WriteCapacityUnits': 10
        }
    )

print('created table:', result)

print('getting table')

table = dynamodb.Table('foo')

print('got table:', table)

從主機運行此,這是我的輸出:

(workbench) ryan@ryan:~/dev/$ python dyn.py 
creating dynamodb resource
got resource: dynamodb.ServiceResource()
adding table
created table: dynamodb.Table(name='foo')
getting table
got table: dynamodb.Table(name='foo')

從容器外殼內部運行相同的代碼:

root@e88da4d624e0:/src# python dyn.py 
creating dynamodb resource
got resource: dynamodb.ServiceResource()
adding table
[... traceback clipped ...]
  File "/usr/local/lib/python3.4/site-packages/botocore/vendored/requests/packages/urllib3/connection.py", line 155, in connect
    conn = self._new_conn()
  File "/usr/local/lib/python3.4/site-packages/botocore/vendored/requests/packages/urllib3/connection.py", line 134, in _new_conn
(self.host, self.port), self.timeout, **extra_kw)
  File "/usr/local/lib/python3.4/site-packages/botocore/vendored/requests/packages/urllib3/util/connection.py", line 88, in create_connection
    raise err
  File "/usr/local/lib/python3.4/site-packages/botocore/vendored/requests/packages/urllib3/util/connection.py", line 78, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
[ ... ]
botocore.vendored.requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionRefusedError(111, 'Connection refused'))

這是一個測試dockerfile,將重現該錯誤:

FROM python:3.4

ADD . /src

# python dependencies
RUN python3 -m pip install -U pip && \
    python3 -m pip install boto3

ENTRYPOINT ["/bin/bash"]

我正在像這樣啟動docker容器:

docker run --name dynamodb -p "8001:8000" -d ryan/dynamodb
docker run --link dynamodb:localhost -ti ryan/app

您正在使用Docker 鏈接功能將兩個容器連接在一起。 這里的基本原則是:

  1. 您可以使用--name為數據庫容器指定唯一的名稱。
  2. 您可以使用--link將客戶端容器鏈接到數據庫,該--link指定數據庫容器的名稱以及客戶端容器內的別名。
  3. Docker然后使用其默認bridge網絡將兩者連接。

這樣,它不需要端口映射到主機網絡(由-p選項提供)。 取而代之的是,docker將使用您在創建鏈接時定義的別名為您完成工作,並在客戶端容器內根據需要公開IP地址和端口。

然后,您可以使用該別名使用docker自動為您創建的環境變量在客戶端容器內查找詳細信息。

除了最后一步,您基本上已經做好了一切。 如果您檢查環境,我希望您會發現端口8000是您想要的端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM