【问题标题】:docker-compose.yml environment variable to php environment variabledocker-compose.yml 环境变量到 php 环境变量
【发布时间】:2020-12-07 06:14:44
【问题描述】:

尝试执行以下操作:将环境值从 .env 文件传播到 php 文件环境值。

在 .env 文件中设置 MYSQL 变量。

#cat .env
MYSQL_ROOT_PASSWORD=RootPassword
MYSQL_USER=gnf_user
MYSQL_PASSWORD=UserPassword
MYSQL_DATABASE=gnf_noah
MYSQL_HOST=db

我希望它传播到我的容器。所以我这样做:

#cat docker-compose.yml
version: "3.2"
services:
 www:
  build: . #Include Dockerfile in current directory
  ports:
  - "30001:80"
  - "30443:443"
  expose:
  - "80"
  - "443"
  volumes:
  - "var:/var/www/html/var/"
  environment:
   MYSQL_HOST: ${MYSQL_HOST}
   MYSQL_DATABASE: ${MYSQL_DATABASE}
   MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
   MYSQL_USER: ${MYSQL_USER}
   MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  restart: always
  networks:
  - frontend
  - backend
  links:
  - db:db
# shortend for readability ;-)

现在,尝试在我的容器中获取这些值:

$db_host = getenv('MYSQL_HOST', true) ?: getenv('MYSQL_HOST');
$db_name = getenv('MYSQL_DATABASE', true) ?: getenv('MYSQL_DATABASE');
$db_user = getenv('MYSQL_USER', true) ?: getenv('MYSQL_USER');
$db_pwd  = getenv('MYSQL_PASSWORD', true) ?: getenv('MYSQL_PASSWORD');

给出空值。

我是在这里完全错误的页面上.. 还是我需要一个脚本来在构建时设置这些值,例如。在 /docker-entrypoint-init.d" 或类似的东西中?

(编辑)使用的文件:

drwxr-xr-x  2 root root  4096 Aug 16 18:54 conf
-rw-r--r--  1 root root  1406 Aug 17 17:17 docker-compose.yaml
-rw-r--r--  1 root root   992 Aug 17 19:31 Dockerfile
drwxr-xr-x  2 root root  4096 Aug 17 14:45 dump
-rw-r--r--  1 root root   125 Aug 17 07:06 .env
-rw-r--r--  1 root root 55799 Aug  6 20:10 install-php-extensions
drwxr-xr-x  2 root root  4096 Aug 13 08:36 mysql
drwxrwxr-x 25 root 1005  4096 Aug 18 05:40 www

【问题讨论】:

  • .env 文件应与 docker-compose 文件在同一目录中
  • 所有文件都在同一个目录下。见编辑
  • 尝试从容器内部运行echo $MYSQL_HOST,你的设置应该可以在php代码中运行

标签: php docker environment-variables environment


【解决方案1】:

尝试在撰写文件中使用env_file 来引用您的.env

这是一个最小的例子:

.
├── docker-compose.yml
├── Dockerfile
├── .env
└── index.php

Dockerfile

FROM php:7.0-apache
COPY ./index.php /var/www/html/

index.php

<?php
    $db_host = getenv('MYSQL_HOST', true) ?: getenv('MYSQL_HOST');
    $db_name = getenv('MYSQL_DATABASE', true) ?: getenv('MYSQL_DATABASE');
    $db_user = getenv('MYSQL_USER', true) ?: getenv('MYSQL_USER');
    $db_pwd  = getenv('MYSQL_PASSWORD', true) ?: getenv('MYSQL_PASSWORD');

    echo "db_host: {$db_host}<br>";
    echo "db_name: {$db_name}<br>";
    echo "db_user: {$db_user}<br>";
    echo "db_pwd: {$db_pwd}<br>";
?>

docker-compose.yml

version: "3.2"
services:
 www:
  build: . 
  ports:
  - "30001:80"
  - "30443:443"
  env_file:
    - .env

.env

MYSQL_ROOT_PASSWORD=RootPassword
MYSQL_USER=gnf_user
MYSQL_PASSWORD=UserPassword
MYSQL_DATABASE=gnf_noah

组成容器:

docker-compose up -d --build

【讨论】:

  • 我很高兴它做到了。感谢您的反馈!
  • 这样,如果我在浏览器中输入http://localhost:30001/.env,我可以看到带有密码的env文件!
  • @VitoLipari,您是对的:显然,如果在/www/html 中复制该文件,则该文件由 apache 服务器提供,并且在那里不需要它。我更新了答案,以确保没有人在不考虑您所说的情况下复制粘贴该代码剪切。谢谢!
【解决方案2】:

要直接在容器中创建 .env 文件的环境变量,我们使用 docker 的 env_file 配置选项

例如

web:
  env_file:
    - .env

这是将环境变量列表传递到容器中的最微妙的方式。

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 2018-08-14
    • 2015-06-17
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多