gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:57:56 25 4
gpt4 key购买 nike

为了测试,我尝试从 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')

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

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 link feature将两个容器连接在一起。这里的基本原则是:

  1. 您使用 --name 为您的数据库容器指定一个唯一的名称。
  2. 您将客户端容器链接到数据库,使用 --link 指定数据库容器的名称及其在客户端容器内的别名。
  3. 然后 Docker 使用其默认的 bridge 网络将两者连接起来。

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

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

除了这最后一步,您基本上已经搞定了。如果您检查您的环境,我希望您会发现端口 8000 是您想要的。

关于python - 使用 boto3 从 docker 容器内部连接到 DynamoDB Local,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38379091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com