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空白数据库。 请参阅下面的链接
所以你需要遵循类似的方法,并创build一个entrypoint.sh
脚本,一旦容器启动,脚本就会运行,它将为你build立这些资产和其他东西。 你还要确保在运行这些命令之前,mysql容器已经完全启动并准备好接受数据库连接了。
我通常在初始化之前添加15个左右的睡眠。 但是你也可以使用像https://github.com/vishnubob/wait-forit这样的东西。