2

为了测试,我试图从Docker内部运行我的python 3.4应用程序,并连接到DynamoDB Local实例。我可以从主机本地访问DynamoDB,而不会出现任何问题。从Docker容器内部与boto3连接到DynamoDB Local

但是,从Docker容器中点击时出现“连接拒绝错误”。我试过在容器中运行DynamoDB local,并将其链接到应用程序的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) [email protected]:~/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') 

从容器外壳内运行相同的代码:

[email protected]:/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')) 

这里是一个测试码头文件,将重现错误:

FROM python:3.4 

ADD . /src 

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

ENTRYPOINT ["/bin/bash"] 

而且我发动泊坞窗容器是这样的:

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

IIRC,当你链接两个容器时,他们不使用外部映射,所以你可能只需要使用端口8000。您应该可以使用docker在链接容器中创建的[环境变量](https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#/environment-variables)进行检查。 –

+0

这工作,谢谢!如果可以将此评论重新格式化为答案,我很乐意为您奖励赏金。 –

+0

完成!请让我知道是否还有什么你认为会有助于添加... –

回答

2

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

  1. 你给你的数据库容器一个独特的名称,使用--name
  2. 将客户机容器链接到数据库,使用--link指定客户机容器内的数据库容器名称和别名。
  3. 然后Docker使用其默认bridge网络连接两者。

这样做,它不需要端口映射到主机网络(由-p选项提供)。相反,docker将为您完成工作,并使用您在创建链接时定义的别名,在您的客户端容器中公开IP地址和端口。

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

除了这最后一步之外,你基本上已经完全掌握了。如果你检查你的环境,我希望你会发现8000端口是你想要的。

相关问题