2016-09-13 33 views
5

Postępuję zgodnie z instrukcjami pod https://docs.docker.com/compose/django/, aby uzyskać podstawową dokederyzowaną aplikację django. Jestem w stanie uruchomić go lokalnie bez problemu, ale mam problem z jego wdrożeniem w AWS przy użyciu Elastic Beanstalk. Po przeczytaniu here doszedłem do wniosku, że muszę przetłumaczyć docker-compose.yml na Dockerrun.aws.json, aby działał.Jak tłumaczyć docker-compose.yml na Dockerrun.aws.json dla Django

Oryginalny doker-compose.yml jest

version: '2' 
services: 
    db: 
    image: postgres 
    web: 
    build: . 
    command: python manage.py runserver 0.0.0.0:8000 
    volumes: 
     - .:/code 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 

i tutaj jest to, co tłumaczone dotychczas

{ 
    "AWSEBDockerrunVersion": 2, 
    "volumes": [ 
    { 
     "name": "db" 
    }, 
    { 
     "name": "web" 
    } 
    ], 
    "containerDefinitions": [ 
    { 
     "name": "db", 
     "image": "postgres", 
     "essential": true, 
     "memory": 256, 
     "mountPoints": [ 
     { 
      "sourceVolume": "db" 
      "containerPath": "/var/app/current/db" 
     } 
     ] 
    }, 
    { 
     "name": "web", 
     "image": "web", 
     "essential": true, 
     "memory": 256, 
     "mountPoints": [ 
     { 
      "sourceVolume": "web" 
      "containerPath": "/var/app/current/web" 
     } 
     ], 
     "portMappings": [ 
     { 
     "hostPort": 8000, 
     "containerPort": 8000 
     } 
    ], 
    "links": [ 
     "db" 
     ], 
     "command": "python manage.py runserver 0.0.0.0:8000" 
    } 
    ] 
} 

ale to nie działa. Co ja robię źle?

Odpowiedz

3

Starałem się uzyskać tajniki formatu Dockerrun. Sprawdź numer Container Transform: "Zmienia konfiguracje docker-compose, ECS i Marathon" ... oszczędza życie. Oto, co wyprowadza dla Twojego przykładu:

{ 
    "containerDefinitions": [ 
     { 
      "essential": true, 
      "image": "postgres", 
      "name": "db" 
     }, 
     { 
      "command": [ 
       "python", 
       "manage.py", 
       "runserver", 
       "0.0.0.0:8000" 
      ], 
      "essential": true, 
      "mountPoints": [ 
       { 
        "containerPath": "/code", 
        "sourceVolume": "_" 
       } 
      ], 
      "name": "web", 
      "portMappings": [ 
       { 
        "containerPort": 8000, 
        "hostPort": 8000 
       } 
      ] 
     } 
    ], 
    "family": "", 
    "volumes": [ 
     { 
      "host": { 
       "sourcePath": "." 
      }, 
      "name": "_" 
     } 
    ] 
} 
Container web is missing required parameter "image". 
Container web is missing required parameter "memory". 
Container db is missing required parameter "memory". 

Oznacza to, że w tym nowym formacie musisz powiedzieć, ile pamięci przypiszesz do każdego kontenera. Ponadto musisz podać obraz - nie ma opcji do zbudowania. Jak wspomniano w komentarzach, chcesz utworzyć i przesłać do DockerHub lub ECR, a następnie nadać mu tę lokalizację: np. [org name]/[repo]:latest na Dockerhub lub adres URL ECR. Ale container-transform robi dla ciebie mountPoints i volumes - to niesamowite.

1

Masz kilka problemów.

1) "sieć" nie wydaje się być "obrazem", definiuje się ją jako "kompilację". "w twoim doku-komponuj ... Pamiętaj, że Dockerrun.aws.json będzie musiał wyciągnąć obraz skądś (najłatwiej jest użyć repozytoriów ECS)

2) Myślę, że" polecenie "to tablica. Tak więc masz:

"command": ["python" "manage.py" "runserver" "0.0.0.0:8000"] 

3) Twoje punkty montowania są poprawne, ale definicja woluminu u góry jest błędna. { "name": "web", "host": { "SourcePath": "/ var/app/prąd/db" } Nie jestem 100% pewna, ale ścieżka pracuje dla mnie. , jeśli masz plik Dockerrun.aws.json, obok jest katalog o nazwie/db .. to będzie lokalizacja montowania.

+0

Użyłem 'docker build' i' docker push' do hub.docker.com, aby osiągnąć 1), myślę, że potrzebujesz przecinków pomiędzy argumentami dla 2). Ale nadal nie działa ... czy możesz udostępnić Dockerrun.aws.json, który działa dla Ciebie, a także obraz, który działa dla Ciebie? – user3667089