将 docker-compose 环境传递给 symfony 配置

nin*_*dev 5 environment-variables symfony docker

我想将配置参数从 docker-compose 文件传递​​到我的 Symfony 应用程序,我试过这个:

app:
    image: <NGINX + PHP-FPM IMAGE>
    environment:
        DATABASE_HOST: db
Run Code Online (Sandbox Code Playgroud)

我的 parameters.yml 文件:

database_host: "%env(DATABASE_HOST)%"
Run Code Online (Sandbox Code Playgroud)

我收到错误 500“找不到环境变量:DATABASE_HOST”

我也在 docker-compose 中尝试了 SYMFONY__DATABASE_HOST 但也没有工作。

它是如何工作的?

lol*_*sky 3

您收到的错误涉及 Symfony 运行时环境变量(请参阅此处)。Docker compose 环境变量是从驻留在文件的构建上下文(也称为您希望docker-compose运行的.env目录)内的文件中检索的。你真正想要做的是确保你在 Symfony 配置/参数中设置的环境变量与你的文件匹配,尤其是 db hostdocker-compose.ymldocker-compose.yml

您应该考虑将映像分解为 PHP-FPM 和 Nginx 映像,以便根据 Docker此处概述的最佳实践获得更好的潜在可扩展性和关注点分离。所有这些技术都在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
Run Code Online (Sandbox Code Playgroud)

这是我的 .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
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看我的 maxpou docker-symfony 存储库的分支。我已更新 docker-compose.yml 和绑定挂载,以与 Compose 文件格式的版本 3 兼容。