[英]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 链接功能将两个容器连接在一起。 这里的基本原则是:
--name
为数据库容器指定唯一的名称。 --link
将客户端容器链接到数据库,该--link
指定数据库容器的名称以及客户端容器内的别名。 bridge
网络将两者连接。 这样,它不需要端口映射到主机网络(由-p
选项提供)。 取而代之的是,docker将使用您在创建链接时定义的别名为您完成工作,并在客户端容器内根据需要公开IP地址和端口。
然后,您可以使用该别名使用docker自动为您创建的环境变量在客户端容器内查找详细信息。
除了最后一步,您基本上已经做好了一切。 如果您检查环境,我希望您会发现端口8000是您想要的端口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.