diff --git a/docker-compose.yml b/docker-compose.yml index 9e0b7c57..eb26126c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,6 +58,8 @@ services: dockerfile: dynamo.Dockerfile ports: - "8000:8000" + volumes: + - ./dynamo-data:/db networks: - sync redis: diff --git a/dynamo.Dockerfile b/dynamo.Dockerfile index b97a9e13..f7f5d6e6 100644 --- a/dynamo.Dockerfile +++ b/dynamo.Dockerfile @@ -1,32 +1,19 @@ -ARG DB_LOCATION=/home/dynamodblocal/db -FROM amazon/dynamodb-local:2.6.1 AS install - -USER root -RUN yum -y install awscli +FROM amazon/dynamodb-local:2.6.1 USER dynamodblocal ENV AWS_ACCESS_KEY_ID=GOSYNC ENV AWS_SECRET_ACCESS_KEY=GOSYNC -ARG AWS_ENDPOINT=http://localhost:8000 -ARG AWS_REGION=us-west-2 -ARG DB_LOCATION -ARG TABLE_NAME=client-entity-dev -COPY schema/dynamodb/ . -RUN mkdir -p ${DB_LOCATION} && \ - java -jar DynamoDBLocal.jar -sharedDb -dbPath ${DB_LOCATION} & \ - DYNAMO_PID=$! && \ - sleep 15 && \ - aws dynamodb create-table --cli-input-json file://table.json \ - --endpoint-url ${AWS_ENDPOINT} --region ${AWS_REGION} && \ - aws dynamodb update-time-to-live --table-name client-entity-dev \ - --time-to-live-specification "Enabled=true, AttributeName=ExpirationTime" \ - --endpoint-url http://localhost:8000 && \ - kill $DYNAMO_PID +COPY schema/dynamodb/ /schema/ -FROM amazon/dynamodb-local:2.6.1 +VOLUME ["/db"] -ARG DB_LOCATION -COPY --chown=dynamodblocal:dynamodblocal --from=install ${DB_LOCATION} /db +USER root +RUN dnf -y install awscli util-linux \ + && dnf clean all \ + && rm -rf /var/cache/dnf +COPY dynamo.entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] CMD ["-jar", "DynamoDBLocal.jar", "-sharedDb", "-dbPath", "/db"] diff --git a/dynamo.entrypoint.sh b/dynamo.entrypoint.sh new file mode 100644 index 00000000..9cf8856a --- /dev/null +++ b/dynamo.entrypoint.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set -e + +DB_FILE="/db/shared-local-instance.db" +AWS_ENDPOINT=http://localhost:8000 +DYNAMO_USER="dynamodblocal" +AWS_REGION=us-west-2 +TABLE_NAME=client-entity-dev + +echo "Fixing ownership of /db to $DYNAMO_USER user" +chown -R $DYNAMO_USER:$DYNAMO_USER /db + +if [ ! -f "$DB_FILE" ]; then + echo "No DB file found. Bootstrapping schema..." + echo "Starting DynamoDBLocal as $DYNAMO_USER..." + + su $DYNAMO_USER -c "java $*" & + DYNAMO_PID=$! + + echo "Waiting for DynamoDBLocal to become available..." + until su $DYNAMO_USER -c "curl -s '$AWS_ENDPOINT' > /dev/null"; do + sleep 0.5 + done + + echo "Creating table from /schema/table.json..." + su $DYNAMO_USER -c "aws dynamodb create-table --cli-input-json file:///schema/table.json \ + --endpoint-url $AWS_ENDPOINT --region $AWS_REGION" + + echo "Enabling TTL..." + su $DYNAMO_USER -c "aws dynamodb update-time-to-live --table-name $TABLE_NAME \ + --time-to-live-specification 'Enabled=true, AttributeName=ExpirationTime' \ + --endpoint-url $AWS_ENDPOINT --region $AWS_REGION" + + kill $DYNAMO_PID + wait $DYNAMO_PID 2>/dev/null || true + + echo "Schema initialization complete. " +else + echo "DB file already exists. Skipping initialization." +fi + +echo "Starting DynamoDBLocal as $DYNAMO_USER..." +exec su $DYNAMO_USER -c "java $*"