2017-09-06 2 views
0

Ich versuche, eine db und einen Webserver mit Docker komponieren zu installieren.symfony kann Assets nicht beim ersten Mal installieren

meine Docker-compose Datei ist:

version: '3.3' 
services: 
    db: 
    image: pix_db 
    container_name: pix_db 
    image: mysql:5.7 
    volumes: 
     - db_data:/var/lib/mysql 
    restart: always 
    environment: 
     MYSQL_ROOT_PASSWORD: test 
     MYSQL_DATABASE: test 
     MYSQL_USER: test 
     MYSQL_PASSWORD: test 
    networks: 
    - backend 
    api: 
    image: pix_api 
    container_name: pix_api 
    build: 
     context: . 
     dockerfile: ./Dockerfiles/api/Dockerfile.cpu 
    depends_on: 
    - media 
    - db 
    ports: 
    - "8080:8080" 
    networks: 
    - backend 

networks: 
    backend: 
    hidden: 

volumes: 
    db_data: 

Wenn ich diese Zeile in meiner Docker Datei erreichen:

php bin/console assets:install -e prod 

Es mit mehreren Fehler abstürzen wie:

[Doctrine\DBAL\Exception\ConnectionException] 
    An exception occured in driver: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known 

Wenn Ich baue den Container aus der Linie vor: Der Befehl php bin/console assets:install -e prod cr Asche mit dem gleichen Fehler das erste Mal, wenn ich es nenne. aber beim zweiten Mal Erfolg mit:

Installing assets as hard copies. 

--- ----------------------------- ---------------- 
     Bundle      Method/Error 
--- ----------------------------- ---------------- 
    ✔ NelmioApiDocBundle   copy 
     -> web/bundles/nelmioapidoc 
    ✔ AppBundle      copy 
     -> web/bundles/app 
--- ----------------------------- ---------------- 

! [NOTE] Some assets were installed via copy. If you make changes to these assets you have to run this command again. 


[OK] All assets were successfully installed. 
+0

Versuchen Sie, die DB während der Bauzeit zu verwenden? –

Antwort

2

Ihr Problem ist, dass Sie die DB während der Bild Gebäude selbst zuzugreifen versuchen. Jedes Bild wird einzeln erstellt und wenn das Bild gerade ist, hat es keinen Zugang zu irgendwelchen laufenden Diensten wie MySQL DB oder irgendetwas.

Also, wenn Sie etwas wie php bin/console assets:install -e prod verwenden, die Verbindung zur DB wird dann wird es nicht funktionieren. Sie müssen den Befehl so ausführen, dass die DB nicht aufgerufen wird oder Sie die Befehle bis zum Start des Containers verschieben müssen.

Zum Beispiel, wenn Sie das mysql Bild betrachten. Es initiiert die Datenbank während des Builds nicht. Es verwendet eine docker-entrypoint.sh, um die leere DB auch beim Start des Containers zu erstellen. Siehe den Link unten

https://github.com/docker-library/mysql/blob/0590e4efd2b31ec794383f084d419dea9bc752c4/5.7/docker-entrypoint.sh

Sie müssen also ähnlichen Ansatz folgen und erstellen Sie ein Skript, das entrypoint.sh sobald der Behälter beginnt ausgeführt werden, und es wird diese Vermögenswerte und andere Dinge für Sie bauen. Sie möchten auch sicherstellen, dass vor dem Ausführen der Befehle der mysql-Container vollständig eingerichtet und bereit ist, eine DB-Verbindung zu akzeptieren.

Ich normalerweise hinzufügen Schlaf 15 oder so vor der Initialisierung. Aber Sie können auch etwas wie https://github.com/vishnubob/wait-for-it verwenden.

Verwandte Themen