我想将配置参数从docker-compose文件传递给我的Symfony应用程序,我试过这个:
app:
image: <NGINX + PHP-FPM IMAGE>
environment:
DATABASE_HOST: db
我的parameters.yml文件:
database_host: "%env(DATABASE_HOST)%"
我收到错误500&#34;找不到环境变量:DATABASE_HOST&#34;
我还在docker-compose中尝试过SYMFONY__DATABASE_HOST,但也无法正常工作。
它是如何运作的?
答案 0 :(得分:1)
您接收的错误是指Symfony运行时环境变量(see here)。 Docker组合环境变量是从.env
文件中检索的,该文件位于构建上下文(AKA是您希望 docker-compose 运行的目录)的docker-compose.yml
文件中。您真正想要做的是确保您在Symfony配置/参数和docker-compose.yml
文件中设置的环境变量匹配,尤其是数据库主机。
根据Docker here概述的最佳实践,您应该考虑将图像分解为PHP-FPM和Nginx图像,以获得更好的潜在可伸缩性和关注点分离。所有这些技术都在Docker Hub上提供定期维护的图像。
这是我的docker-compose.yml
,它在多容器环境中为PHP-FPM,MySQL和Nginx创建容器,并提供截至目前的最新稳定包。
version: '3'
services:
db:
image: mysql
volumes:
- ./.data/db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
php:
build: php7.1-fpm
depends_on:
- db
ports:
- "9000:9000"
volumes:
- symfony-bind-mount:/var/www/symfony
- symfony-logs-bind-mount:/var/www/symfony/app/logs
nginx:
build: nginx
depends_on:
- php
ports:
- "8025:8025"
- "80:80"
volumes:
- symfony-bind-mount:/var/www/symfony
- nginx-logs-bind-mount:/var/log/nginx
volumes:
symfony-bind-mount:
driver: local
driver_opts:
o: bind,rw
type: none
device: ${SYMFONY_APP_PATH}
nginx-logs-bind-mount:
driver: local
driver_opts:
o: bind,rw
type: none
device: ${DOCKER_SYMFONY_PATH}/logs/nginx
symfony-logs-bind-mount:
driver: local
driver_opts:
o: bind,rw
type: none
device: ${DOCKER_SYMFONY_PATH}/logs/symfony
这是我的.env档案:
# Symfony application's path
SYMFONY_APP_PATH=/absolute/path/to/symfony/project
# Path to local docker-symfony repository
DOCKER_SYMFONY_PATH=/absolute/path/to/sibling/docker/directory
# MySQL
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=mydb
MYSQL_USER=
MYSQL_PASSWORD=password
您可以查看我的maxpou的docker-symfony存储库here的分支。我已经更新了docker-compose.yml和绑定挂载以与Compose文件格式的版本3兼容。