繁体   English   中英

连接到 DynamoDB 时出错 Docker 容器

[英]Error connecting to DynamoDB Docker Container

我正在学习 PHP 并尝试在 dynamodb docker 容器上创建一个表。 我的 docker compose、web (nginx)、php(7.1-fpm) with AWS SDK 和 dynamodb 中有 3 个容器。 (下面的 Dockerfile)。

我收到以下错误:

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 容器中使用 db 和 dynamodb:db 链接)

我必须尝试 map web 8000:8000 上的端口,我愿意接受任何建议。

对于可能遇到与我类似问题的任何人:

我需要将 dynamodb 容器链接到 php 容器,因为 php 容器正在运行代码而不是 Web 容器。

这个 docker-compose 文件让我排序:

web:
  image: nginx:latest
  ports:
    - "8080:80"
    - "8000:8000"
  volumes:
    - ./code:/code
    - ./site.conf:/etc/nginx/conf.d/site.conf
  links:
    - php
    - dynamodb:db // <-- Probably unnecessary, requires more testing
php:
  build: php/
  volumes:
    - ./code:/code
  links:
    - dynamodb // <-- Important
dynamodb:
  build: dynamodb/
  expose:
    - 8000

使用 ENTRYPOINT 而不是 RUN

# Dockerfile
COPY ./run.sh /run.sh

ENTRYPOINT ["chmod", "+x", "/run.sh"]
#!/bin/sh

cd /aws-sdk-php
composer install # this line can put on Dockerfile too.
make build
make test

根据文档,链接功能现在是旧版:

--link 标志是 Docker 的遗留功能。它最终可能会被删除。 除非您绝对需要继续使用它,否则我们建议您使用 user-defined.networks 来促进两个容器之间的通信,而不是使用 --link。 user-defined.networks 不支持的一项功能,您可以使用 --link 来实现,即在容器之间共享环境变量。 但是,您可以使用其他机制(例如卷)以更可控的方式在容器之间共享环境变量。

user defined.network 现在可以促进通信,这是您可以如何做到的:

web:
  image: nginx:latest
  ports:
    - "8080:80"
    - "8000:8000"
  volumes:
    - ./code:/code
    - ./site.conf:/etc/nginx/conf.d/site.conf
  networks:
    - app-network

php:
  build: php/
  volumes:
    - ./code:/code
  networks:
    - app-network

dynamodb:
  build: dynamodb/
  expose:
    - 8000
  networks:
    - app-network

networks:
  app-network:
     driver: bridge

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM