Docker Image DynamoDB 无法打开数据库文件

问题描述 投票:0回答:2

我正在尝试使用本地卷来运行 AWS DynamoDB 服务的 docker 映像来存储数据。当我尝试创建第一个表时,我会重复以下顺序,直到最终脚本失败。

dynamodb-local           | Aug 31, 2022 3:32:49 PM com.almworks.sqlite4java.Internal log
dynamodb-local           | WARNING: [sqlite] SQLiteQueue[shared-local-instance.db]: stopped abnormally, reincarnating in 3000ms
dynamodb-local           | Aug 31, 2022 3:32:52 PM com.almworks.sqlite4java.Internal log
dynamodb-local           | WARNING: [sqlite] cannot open DB[5]: com.almworks.sqlite4java.SQLiteException: [14] unable to open database file
dynamodb-local           | Aug 31, 2022 3:32:52 PM com.almworks.sqlite4java.Internal log
dynamodb-local           | SEVERE: [sqlite] SQLiteQueue[shared-local-instance.db]: error running job queue
dynamodb-local           | com.almworks.sqlite4java.SQLiteException: [14] unable to open database file
dynamodb-local           |      at com.almworks.sqlite4java.SQLiteConnection.open0(SQLiteConnection.java:1480)
dynamodb-local           |      at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:282)
dynamodb-local           |      at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:293)
dynamodb-local           |      at com.almworks.sqlite4java.SQLiteQueue.openConnection(SQLiteQueue.java:464)
dynamodb-local           |      at com.almworks.sqlite4java.SQLiteQueue.queueFunction(SQLiteQueue.java:641)
dynamodb-local           |      at com.almworks.sqlite4java.SQLiteQueue.runQueue(SQLiteQueue.java:623)
dynamodb-local           |      at com.almworks.sqlite4java.SQLiteQueue.access$000(SQLiteQueue.java:77)
dynamodb-local           |      at com.almworks.sqlite4java.SQLiteQueue$1.run(SQLiteQueue.java:205)
dynamodb-local           |      at java.lang.Thread.run(Thread.java:750)

我的 docker-compose 文件基于 AWS 文档中的文件 (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html)

version: "3.9"  # optional since v1.27.0
services:
  server:
    build:
      context: ./server/
      dockerfile: Dockerfile.consumer
    ports:
      - "5558:5558"
    depends_on:
      - "dynamodb-local"
    environment:
      AWS_ACCESS_KEY_ID: 'DUMMYIDEXAMPLE'
      AWS_SECRET_ACCESS_KEY: 'DUMMYEXAMPLEKEY'

  dynamodb-local:
    image: "amazon/dynamodb-local:latest"
    ports:
      - "8000:8000"
    volumes:
      - "data:/home/dynamodblocal/data"
    command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
    container_name: dynamodb-local
    working_dir: /home/dynamodblocal



volumes:
  logvolume01: {}
  data: {}

下面是我正在创建的表格

import boto3
from pprint import pprint
from botocore.exceptions import ClientError


TABLE_NAME = "check_tbl"
dynamodb = boto3.client(
            'dynamodb',
            region_name="us-east-1",
            aws_access_key_id="dummy_access_key",
            aws_secret_access_key="dummy_secret_key",
            endpoint_url="http://localhost:8000",
        )

try:
    response = dynamodb.describe_table(TableName=TABLE_NAME)

except ClientError as ce:
    if ce.response['Error']['Code'] == 'ResourceNotFoundException':
        result = dynamodb.create_table(
            TableName=TABLE_NAME,
                KeySchema=[
                    {
                        'AttributeName': 'id',
                        'KeyType': 'HASH'  # Partition key
                    }
                ],
                AttributeDefinitions=[
                    {
                        'AttributeName': 'timestamp',
                        'AttributeType': 'D'
                    }
                ],
                ProvisionedThroughput={
                    'ReadCapacityUnits': 10,
                    'WriteCapacityUnits': 10
                }
            )

    else:
        print("Unknown exception occurred while querying for the " + TABLE_NAME + " table. Printing full error:")
        pprint(ce.response)

我的卷路径(/var/lib/docker/volumes/data)由root拥有,但这似乎不太可能。

docker amazon-dynamodb
2个回答
1
投票

我遇到了同样的错误,通过将我的用户添加到图像创建的文件夹中解决了这个问题:

sudo chown $user -R docker

0
投票

我认为你需要在卷的开头添加一个点斜线

volumes:
  - "./data:/home/dynamodblocal/data"

然后,正如 @Hernando Correa 所说,如果您使用 sudo 运行 docker,并且在先运行 docker 之前没有创建 ./data 目录,那么 docker 会在您的用户没有写入权限的位置创建该目录。因此,您可以通过在您撰写的目录中运行它来修复:

sudo chown Brian:Brian -R data

或者确保在运行 docker compose 之前首先创建卷中使用的任何目录

© www.soinside.com 2019 - 2024. All rights reserved.