我扩展了Wordpress图像,添加了Xcovery,PHPUnit,composer和phpcs。
我的项目根看起来像这样:
docker-wordpress
Dockerfile
docker-compose.yml
.env
字符串
docker-compose.yml:
version: '3.7'
services:
db:
image: mysql:5.7
volumes:
- ./docker-mysql/db_data:/var/lib/mysql
restart: always
ports:
- "3306:3306"
env_file: .env
wordpress:
depends_on:
- db
image: progonkpa/mywordpress
ports:
- "80:80"
- "443:443"
restart: always
volumes:
- ./src:/var/www/html
env_file: .env
volumes:
db_data:
型
这个配置可以工作,但只是因为我显式地添加了env_file声明,而我认为如果我遵循正确的约定,Docker会自动拾取文件:根目录下的.env文件。
我实际上想删除docker-compose.yml中的env_file声明,但后来我遇到了一些问题。
MySQL容器日志:
database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD
型
我似乎在第一次运行时,当容器被初始化时,我与mysql相关的变量没有通过。.env文件包含通常的Wordpress和MySQL变量:
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
MYSQL_ROOT_PASSWORD=wordpress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress
型
那么为什么我的变量不能到达容器呢?
4条答案
按热度按时间bqjvbblv1#
这里有两个地方可以使用变量:在compose文件本身内部,以及在
docker-compose
创建的容器内部。docker-compose
将使用.env
文件来调整docker-compose
命令本身的环境。这对于yaml文件中需要扩展的变量或compose本身使用的变量很有用。有关后者的更多信息,请参阅the compose CLI variables docs。在yaml中定义
env_file
将从文件中获取环境变量并将其注入容器中。这使得它对应用程序可见,但不能用于您希望docker-compose
扩展的yaml中的变量,因为变量扩展发生在env_file
内容解析之前。fzwojiic2#
Docker-compose需要显式定义所有内容,将其视为
docker run parameter
,它只在docker-compose文件中定义的每个容器上应用这些配置或参数。因此,如果已经在Dockerfile中声明了ENV,则应避免覆盖ENV,因此您需要为自己显式定义这些配置。
当我们构建docker时,我们在docker-image中设置了一些默认配置,但是
docker run command
和docker-compose
提供了覆盖这些配置的功能,以在镜像作为容器启动时生效。服务定义包含应用于为该服务启动的每个容器的配置,就像将命令行参数传递给docker container create一样。同样,网络和卷定义类似于docker network create和docker volume create。
compose-file
env_file
从文件中添加环境变量。可以是单个值或列表。
如果您指定了一个使用
docker-compose -f FILE
编写的文件,则env_file
中的路径是相对于该文件所在的目录的。在环境部分中声明的环境变量覆盖这些值-即使这些值为空或未定义,也是如此。
字符串
kkbh8khc3#
您可以使用
docker compose config
打印我们解析的应用程序配置(包括environment
部分),以查看变量扩展,变量插值和体内实验。通过使用它,你可以自己回答什么有效,什么无效
1wnzp6jl4#
安全性:将敏感信息(如API密钥或数据库密码)存储在单独的文件中提供了额外的安全层。env_file可以从版本控制系统(如Git)中排除,以防止敏感信息的意外暴露。