DynamoDB est bon marché et rapide, n'est-ce pas? Saviez-vous qu'il existe une image Docker pour développer un tel DynamoDB localement? Nous allons nous renseigner sur un exemple de création d'un environnement de développement à l'aide d'une telle image Docker.
La version de l'image à utiliser en fonction de l'environnement de production est la suivante. Utilisez dynamodb-admin pour le fonctionnement GUI de DynamoDB. Node est utilisé lors de la construction de l'environnement ensemble.
environnement | version |
---|---|
Python | 3.7.4 |
MySQL | 5.7 |
Node | 10.16.3-alpine |
Puisque nous construisons à partir de zéro, nous allons d'abord démarrer le projet Django. L'image officielle de Django est une ancienne version, je vais donc la créer moi-même.
$ django-admin startproject dynamodb_example
$ cd dynamodb_example/
$ touch docker-compose.yml
$ touch Dockerfile
FROM python:3.7.4
RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils gettext
RUN mkdir /app; mkdir /app/dynamodb_example
WORKDIR /app
COPY dynamodb_example /app/dynamodb_example
COPY requirements.txt /app/
COPY manage.py /app/
RUN pip install -r requirements.txt
EXPOSE 8080
CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"]
docker-compose.yml
version: "3"
services:
mysql:
container_name: example-mysql
ports:
- 53306:3306
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./persist/mysql:/var/lib/mysql
restart: always
environment:
MYSQL_USER: example
MYSQL_PASSWORD: example
MYSQL_DATABASE: example
MYSQL_ROOT_PASSWORD: example
django:
container_name: example-django
build: .
volumes:
- .:/app
working_dir: /app
command: sh -c "./wait-for-it.sh db:3306; python3 manage.py runserver 0.0.0.0:8000"
env_file: .env
ports:
- 58080:8000
depends_on:
- mysql
Il y a 50 000 ports parce que je ne veux certainement pas les porter. Il n'y a pas de signification particulière. La bibliothèque de connexion à DynamoDB contient ** boto3 ** et ** pynamodb ** qui l'encapsule.
requirements.txt
boto3
pynamodb
Django==2.2.4
djangorestframework==3.10.3
django-filter
mysqlclient==1.3.13
Je ne comprends pas vraiment les variables d'environnement, mais ...
.env
DB_ENGINE=django.db.backends.mysql
DB_HOST=mysql
DB_DATABASE=example
DB_USERNAME=root
DB_PASSWORD=example
DB_PORT=3306
Pour le moment, je veux vérifier la communication entre Django et MySQL, donc je vais réécrire les BASES DE DONNÉES de Django.
setting.py
DATABASES = {
'default': {
'ENGINE': os.getenv('DB_ENGINE'),
'NAME': os.getenv('DB_DATABASE'),
'USER': os.getenv('DB_USERNAME'),
'PASSWORD': os.getenv('DB_PASSWORD'),
'HOST': os.getenv('DB_HOST'),
'OPTIONS': {
'init_command': 'SET foreign_key_checks = 0;',
'charset': 'utf8mb4',
},
}
}
Si vous arrivez à ce point, vérifiez si cela commence pour le moment.
$ docker-compose up -d
$ docker-compose exec django bash
$ python manage.py migrate
Si tout se passe bien, ajoutez ** DynamoDB Local ** et ** dynamodb-admin **.
DynamoDB Local Liste dynamodb dans docker-compose.yml. Spécifiez dbPath à la fin de la commande pour le rendre persistant.
docker-compose.yml
dynamodb:
container_name: example-dynamodb
image: amazon/dynamodb-local
command: -jar DynamoDBLocal.jar -dbPath /home/dynamodblocal/data
volumes:
- ./persist/dynamodb:/home/dynamodblocal/data
ports:
- 50706:8000
dynamodb-admin J'avais une image officielle, mais je l'ai faite, donc je vais l'utiliser.
$ mkdir dynamodb-admin
$ touch dynamodb-admin/Dockerfile
$ touch dynamodb-admin/.env
FROM node:10.16.3-alpine
RUN ["apk", "update"]
RUN ["npm", "install", "dynamodb-admin", "-g"]
EXPOSE 50727
CMD ["dynamodb-admin", "-p", "50727"]
Dans la variable d'environnement DYNAMO_ENDPOINT
, spécifiez le nom du service conteneur de dynamodb et le port côté conteneur.
.env
DYNAMO_ENDPOINT=http://dynamodb:8000
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=ACCESS_ID
AWS_SECRET_ACCESS_KEY=ACCESS_KEY
Le fichier final docker-compose.yml avec ce dyanamodb-admin ressemble à ceci:
docker-compose.yml
version: "3"
services:
dynamodb:
container_name: example-dynamodb
image: amazon/dynamodb-local
command: -jar DynamoDBLocal.jar -dbPath /home/dynamodblocal/data
volumes:
- ./persist/dynamodb:/home/dynamodblocal/data
ports:
- 50706:8000
dynamodb-admin:
container_name: example-dynamodb-admin
build: dynamodb-admin/
command: dynamodb-admin -p 8000
env_file: dynamodb-admin/.env
ports:
- 50727:8000
depends_on:
- dynamodb
mysql:
container_name: example-mysql
ports:
- 53306:3306
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./persist/mysql:/var/lib/mysql
restart: always
environment:
MYSQL_USER: example
MYSQL_PASSWORD: example
MYSQL_DATABASE: example
MYSQL_ROOT_PASSWORD: example
django:
container_name: example-django
build: .
volumes:
- .:/app
working_dir: /app
command: sh -c "./wait-for-it.sh db:3306; python3 manage.py runserver 0.0.0.0:8000"
env_file: .env
ports:
- 58080:8000
depends_on:
- mysql
- dynamodb
Si [http: // localhost: 50727](http: // localhost: 50727) s'affiche dans le navigateur et que les éléments suivants s'affichent, l'opération réussit. Vous pouvez faire ce que vous voulez avec Create Table, etc.
Je vais faire un tableau de manière appropriée. Cela a été créé.
Supprimez le conteneur et redémarrez-le.
$ docker-compose down
$ docker-compose up -d
Si vous ouvrez [http: // localhost: 50727](http: // localhost: 50727) et que la table précédente reste, la persistance est également réussie.
Ce référentiel sera publié ci-dessous. La balise est ** 1.0.0 ** car elle pourrait être mise à jour ultérieurement. https://github.com/Cohey0727/example_dynamodb Veuillez l'utiliser si vous le souhaitez.
Recommended Posts