我有以下项目目录结构:
myapp/
docker/
docker-compose.yml
.env
src/
<my source code here>
config.properties
这是我的.env
文件:
ENV=local
SERVICE_DB_HOST=0.0.0.0
SERVICE_DB_PORT=3306
SERVICE_DB_ROOT_PASSWORD=12345
SERVICE_DB_APP_USER=my-service-user
SERVICE_DB_APP_PASSWORD=23456
这是我的docker/docker-compose.yml
version: "3.7"
services:
myapp-main-db:
env_file:
- ../.env
image: mysql:8
container_name: myapp-main-db
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- $SERVICE_DB_PORT:$SERVICE_DB_PORT
environment:
MYSQL_ROOT_PASSWORD: $SERVICE_DB_ROOT_PASSWORD
MYSQL_DATABASE: myapp_service_db_$ENV
MYSQL_USER: $SERVICE_DB_APP_USER
MYSQL_PASSWORD: $SERVICE_DB_APP_PASSWORD
volumes:
- myapp-service-db-data:/var/lib/mysql
volumes:
myapp-service-db-data:
当我从项目根目录运行docker-compose -f docker/docker-compose.yml up -d
时,我看到MySQL容器在没有问题的情况下旋转,并通过docker ps
验证它的运行情况。
然而,我无法使用预期的连接字符串和凭据连接到它,我确信是正确的。这使我相信Docker并没有像我期望的那样加载../.env
文件,因此../.env
中定义的变量中没有一个被注入为env。
有人能发现我要出错的地方吗?
更新
当我运行docker-compose config
时,我得到:
$ docker-compose config
WARNING: The SERVICE_DB_PORT variable is not set. Defaulting to a blank string.
WARNING: The SERVICE_DB_ROOT_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The ENV variable is not set. Defaulting to a blank string.
WARNING: The SERVICE_DB_APP_USER variable is not set. Defaulting to a blank string.
WARNING: The SERVICE_DB_APP_PASSWORD variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.myapp-main-db.ports contains an invalid type, it should be a number, or an object
发布于 2021-06-03 11:43:11
Compose有两个单独的环境文件处理层:
docker-compose.yml
文件时,它从与docker-compose.yml
相同的目录中读取.env
文件,并使用该文件扩展$VARIABLE
引用。env_file:
并使用它来设置容器中的环境变量。由于.env
不在与docker-compose.yml
文件相同的目录中,所以在文件中展开变量之前,Compose不会读取它。这将导致容器获取数据库凭据的空字符串,并导致错误,因为ports:
格式错误。
您可以将.env
移动到与docker-compose.yml
相同的目录中。
mv .env docker
docker-compose -f docker/docker-compose.yml up
或者传递一个docker-compose --env-file
选项
docker-compose -f docker-docker-compose.yml --env-file .env up
对于这种特殊用途,您不需要在env_file:
文件中使用docker-compose.yml
,并且可以删除它。
为了进一步调试这一点,您可以使用备用的docker-compose run
来对容器进行command:
调试。例如,您可以使用docker-compose run myapp-main-db env
打印它的环境,而不是启动数据库。我希望你在这里看到的流程是:
docker/.env
(来自与docker-compose.yml
文件相同的目录),这是不存在的MYSQL_USER
是一个空字符串env_file:
;容器将具有来自该文件的附加环境变量SERVICE_DB_APP_USER=my-service-user
。发布于 2021-06-03 11:12:20
根据docker的默认行为,Dockerfile和docker-组合不会从父目录读取任何文件或值。它总是从当前目录或子目录读取。
因此,对于您的代码,我建议您在源目录/根目录中使用docker-组合文件。
示例:
myapp/
docker-compose.yml
.env
src/
<my source code here>
config.properties
发布于 2021-06-03 11:45:17
引用来自正式的码头文档:使用“-env-file”选项。
您可以在任何地方使用.env文件,使用--env-file选项: 通过将文件作为参数传递,您可以将其存储在任何地方,并将其命名为适当的名称,例如.env.ci、.env.dev、.env.prod。传递文件路径是使用--env-file选项完成的: docker-组合--env-file ./config/.env.dev up
显然,当您在docker-组合中时,不能转到当前目录的父目录来获取.env文件,因此,不像这样:
version: "3.7"
services:
myapp-main-db:
env_file:
- ../.env
使用来自父文件夹的其他地方的.env文件的一种方法是使用docker-compose
命令的--project-directory
参数。根据正式码头医生
.env文件路径如下: 从+v1.28开始,.env文件放在项目目录的底部 对于以前的版本,它被放置在当前工作目录中,其中Docker命令执行,除非定义了一个-project-目录,该目录覆盖.env文件的路径。这种不一致性在+v1.28中是通过将filepath限制在项目目录下来解决的。。“
这就意味着在你的情况下:
docker-compose --project-directory .. up
或者:如果您将系统中的任何.env文件作为docker-compose
命令的--env-file
参数传递,则可以访问它。
docker-compose --env-file ../.env up
如果既不使用--project-directory
也不使用--env-file
,则需要将.env文件放置在停靠器-复合文件所在的位置。
https://stackoverflow.com/questions/67820106
复制相似问题