symfony不能第一次安装资产

我尝试安装一个数据库和Web服务器与docker撰写。

我的docker组成文件是:

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: 

当我在我的docker文件中到达这一行时:

 php bin/console assets:install -e prod 

它崩溃了几个错误,如:

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

当我从行build立容器之前:命令php bin/console assets:install -e prod崩溃与我第一次调用它相同的错误。 但第二次成功与:

 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. 

你的问题是,你正在尝试在图像构build过程中访问数据库。 每个图像都是单独构build的,当图像正在运行时,它不能访问任何正在运行的服务,如mysql数据库或任何东西。

所以,如果你使用像php bin/console assets:install -e prod东西php bin/console assets:install -e prod将连接到数据库然后它将无法正常工作。 您需要以不调用DB的方式执行命令,或者需要延迟命令直到容器启动。

例如,如果你看看MySQL的图像。 它不会在构build期间初始化数据库。 它使用docker-entrypoint.sh在容器启动时也构build空白数据库。 请参阅下面的链接

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

所以你需要遵循类似的方法,并创build一个entrypoint.sh脚本,一旦容器启动,脚本就会运行,它将为你build立这些资产和其他东西。 你还要确保在运行这些命令之前,mysql容器已经完全启动并准备好接受数据库连接了。

我通常在初始化之前添加15个左右的睡眠。 但是你也可以使用像https://github.com/vishnubob/wait-forit这样的东西。