使用boto3从docker容器内部连接到DynamoDB Local

时间:2016-07-14 16:06:07

标签: python python-3.x amazon-web-services docker amazon-dynamodb

为了测试,我试图从docker内部运行我的python 3.4应用程序,并连接到DynamoDB Local实例。我可以毫无问题地从主机访问本地的DynamoDB。

然而,我得到一个"连接拒绝错误"当从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')

从容器shell中运行相同的代码:

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

1 个答案:

答案 0 :(得分:3)

您正在使用泊坞窗link feature将两个容器连接在一起。这里的基本原则是:

  1. 使用--name为您的数据库容器指定一个唯一的名称。
  2. 将客户端容器链接到数据库,使用--link指定数据库容器的名称及其在客户端容器中的别名。
  3. Docker然后使用默认的bridge网络连接两者。
  4. 这样做,它不需要端口映射到主机网络(由-p选项提供)。相反,docker将为您完成工作,并使用您在创建链接时定义的别名在客户端容器中根据需要公开IP地址和端口。

    然后,您可以使用此别名使用environment variables自动为您创建的泊坞窗在客户端容器内查找详细信息。

    除了最后一步之外,你基本上都做得很好。如果您查看了您的环境,我希望您能找到您想要的端口8000。