我正在学习PHP并尝试在Dynamodb的Docker容器上创建一个表。我在我的Docker compose中有3个容器,web(nginx),带有AWS SDK的php(7.1-fpm),和Dynamodb。(下面的Dockerfiles)。
出现以下错误:Unable to create table: Error executing "CreateTable" on "http://dynamodb:8000"; AWS HTTP error: cURL error 6: Could not resolve host: dynamodb (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
我有下面的docker-composer.yml
web:
image: nginx:latest
ports:
- "8080:80"
- "8000:8000" // as you can see i tried to open the port on web if that was the problem
volumes:
- ./code:/code
- ./site.conf:/etc/nginx/conf.d/site.conf
links:
- php
- dynamodb:db // i also tried to access it by dynamodb or db
php:
build: php/
volumes:
- ./code:/code
dynamodb:
build: dynamodb/
expose:
- 8000 // I think this is redundant I also have expose in the Dockerfile
DynamoDb Dockerfile
:
FROM openjdk:7
MAINTAINER <redacted>
RUN mkdir -p opt/dynamodb
WORKDIR /opt/dynamodb
RUN wget http://dynamodb-local.s3-website-us-west-2.amazonaws.com/dynamodb_local_latest.tar.gz -q -O - | tar -xz
ENV AWS_ACCESS_KEY_ID MINE
ENV AWS_SECRET_ACCESS_KEY MINE TOO
EXPOSE 8000
ENTRYPOINT ["java", "-jar", "DynamoDBLocal.jar", "-sharedDb"]
PHP Dockerfile:
FROM php:7.1-fpm
RUN apt-get update && \
apt-get -y install git libz-dev libtidy-dev && \
docker-php-ext-install tidy && \
docker-php-ext-install zip
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# PHP Configuration required for PHP SDK
RUN touch /usr/local/etc/php/conf.d/memory.ini \
&& echo "memory_limit = 2048M;" >> /usr/local/etc/php/conf.d/memory.ini
RUN touch /usr/local/etc/php/conf.d/phar.ini \
&& echo "phar.readonly = Off;" >> /usr/local/etc/php/conf.d/phar.ini
RUN touch /usr/local/etc/php/conf.d/timezone.ini \
&& echo "date.timezone ='America/Los_Angeles'" >> /usr/local/etc/php/conf.d/timezone.ini
RUN cd / && \
git clone https://github.com/aws/aws-sdk-php.git
ENV AWS_ACCESS_KEY_ID MINE
ENV AWS_SECRET_ACCESS_KEY MINE TOO
RUN cd /aws-sdk-php && \
composer install && \
make build && \
make test
index.php
<?php
require("/aws-sdk-php/vendor/autoload.php");
use Aws\DynamoDb\Exception\DynamoDbException;
$sdk = new Aws\Sdk([
'endpoint' => 'http://localhost:8000', // i have tried localhost, db, and dynamodb here
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => [
'key' => 'mine',
'secret' => 'mine too'
]
]);
$dynamodb = $sdk->createDynamoDb();
$params = [
'TableName' => 'Movies',
'KeySchema' => [
[
'AttributeName' => 'year',
'KeyType' => 'HASH'
],
[
'AttributeName' => 'title',
'KeyType' => 'RANGE'
]
],
'AttributeDefinitions' => [
[
'AttributeName' => 'year',
'AttributeType' => 'N'
],
[
'AttributeName' => 'title',
'AttributeType' => 'S'
],
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 10,
'WriteCapacityUnits' => 10
]
];
try {
$result = $dynamodb->createTable($params);
echo 'Created table. Status: ' .
$result['TableDescription']['TableStatus'] ."\n";
} catch (DynamoDbException $e) {
echo "Unable to create table: \n";
echo $e->getMessage() . "\n";
}
?>
我是新的Docker,PHP和AWS,所以如果我错过了任何所需的信息,让我知道。
"我尝试过什么"
我尝试过使用localhost而不是dynamodb(也尝试过在Web容器中使用带有dynamodb:db链接的db)
我不得不尝试Map网络上的端口8000:8000,我愿意接受任何建议。
3条答案
按热度按时间gt0wga4j1#
对于任何可能遇到与我类似问题的人:
我需要将dynamodb容器链接到php容器,因为php容器运行的是代码而不是Web容器。
这个docker-compose文件让我整理了一下:
3qpi33ja2#
使用ENTRYPOINT代替RUN
第一个
7hiiyaii3#
根据文档,link功能现在是传统功能:
--link标志是Docker的一个传统功能。它最终可能会被删除。除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不是使用--link。用户定义的网络不支持的一个功能是在容器之间共享环境变量,而您可以使用--link来完成该功能。但是,您可以使用其他机制(如卷)以更可控的方式在容器之间共享环境变量。
现在,用户定义的网络可促进通信,以下是您的操作方法: