爲了測試,我試圖從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
IIRC,當你鏈接兩個容器時,他們不使用外部映射,所以你可能只需要使用端口8000。您應該可以使用docker在鏈接容器中創建的[環境變量](https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#/environment-variables)進行檢查。 –
這工作,謝謝!如果可以將此評論重新格式化爲答案,我很樂意爲您獎勵賞金。 –
完成!請讓我知道是否還有什麼你認爲會有助於添加... –