DynamoDB ist billig und schnell, nicht wahr? Wussten Sie, dass es ein Docker-Image für die lokale Entwicklung einer solchen DynamoDB gibt? Wir werden nach einem Beispiel für die Erstellung einer Entwicklungsumgebung mit einem solchen Docker Image fragen.
Die Version des Bildes, die entsprechend der Produktionsumgebung verwendet werden soll, lautet wie folgt. Verwenden Sie dynamodb-admin für den GUI-Betrieb von DynamoDB. Der Knoten wird beim gemeinsamen Aufbau der Umgebung verwendet.
Umgebung | Ausführung |
---|---|
Python | 3.7.4 |
MySQL | 5.7 |
Node | 10.16.3-alpine |
Da wir von Grund auf neu bauen, werden wir zuerst das Django-Projekt starten. Das offizielle Django-Bild ist eine alte Version, also werde ich es selbst machen.
$ 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
Es gibt 50.000 Ports, weil ich sie definitiv nicht tragen möchte. Es gibt keine besondere Bedeutung. Die Bibliothek zum Herstellen einer Verbindung mit DynamoDB enthält ** boto3 ** und ** pynamodb **, die sie umschließen.
requirements.txt
boto3
pynamodb
Django==2.2.4
djangorestframework==3.10.3
django-filter
mysqlclient==1.3.13
Ich verstehe Umgebungsvariablen nicht wirklich, aber ...
.env
DB_ENGINE=django.db.backends.mysql
DB_HOST=mysql
DB_DATABASE=example
DB_USERNAME=root
DB_PASSWORD=example
DB_PORT=3306
Vorerst möchte ich die Kommunikation zwischen Django und MySQL überprüfen, damit ich Djangos DATENBANKEN neu schreiben kann.
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',
},
}
}
Wenn Sie an diesem Punkt angelangt sind, prüfen Sie, ob es vorerst beginnt.
$ docker-compose up -d
$ docker-compose exec django bash
$ python manage.py migrate
Wenn alles gut geht, fügen Sie ** DynamoDB Local ** und ** dynamodb-admin ** hinzu.
DynamoDB Local Listen Sie dynamodb in docker-compose.yml auf. Geben Sie am Ende des Befehls dbPath an, um ihn dauerhaft zu machen.
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 Ich hatte ein offizielles Bild, aber ich habe es gemacht, also werde ich das verwenden.
$ 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"]
Geben Sie in der Umgebungsvariablen "DYNAMO_ENDPOINT" den Containerservice-Namen von dynamodb und den Port auf der Containerseite an.
.env
DYNAMO_ENDPOINT=http://dynamodb:8000
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=ACCESS_ID
AWS_SECRET_ACCESS_KEY=ACCESS_KEY
Die endgültige Datei docker-compose.yml mit diesem dyanamodb-admin sieht folgendermaßen aus:
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
Wenn [http: // localhost: 50727](http: // localhost: 50727) im Browser angezeigt wird und Folgendes angezeigt wird, ist dies erfolgreich. Mit Create Table etc. können Sie tun, was Sie wollen.
Ich werde einen Tisch entsprechend machen. Es wurde kreiert.
Löschen Sie den Container und starten Sie ihn neu.
$ docker-compose down
$ docker-compose up -d
Wenn Sie [http: // localhost: 50727](http: // localhost: 50727) öffnen und die vorherige Tabelle erhalten bleibt, ist auch die Persistenz erfolgreich.
Dieses Repository wird unten veröffentlicht. Das Tag ist ** 1.0.0 **, da es möglicherweise in Zukunft aktualisiert wird. https://github.com/Cohey0727/example_dynamodb Bitte benutzen Sie es, wenn Sie möchten.
Recommended Posts