如何在docker-compose up过程中将文件内容复制到服务?

时间:2019-07-20 05:17:03

标签: docker docker-compose

我有2个文件:

.env
docker-compose.yml

docker-compose.yml看起来像这样:

version: '3'

services:
  database:
    image: mysql:5.7
  myapp:
    image: me/some-image
    depends_on:
      - database
    env_file: .env

myapp是一个Web服务应用程序,需要一个.env文件;或者,如果不存在.env文件,则可以选择访问环境变量。

到目前为止,myapp正在访问环境变量,因为出于安全原因,我不希望将.env文件包含在映像构建中。我所做的是将env_file: .env文件中的docker-compose.yml传递给myapp服务,这样它将依赖于服务的环境变量而不是.env文件。

现在,我真的想在运行docker-compose up时向myapp服务中添加一个.env文件。请注意,如果myapp Web服务未找到.env文件,则将引发错误,该选项是查找.env文件,而不是从容器的环境变量获取。

运行docker-compose up时是否可以创建.env文件并在主机上复制.env文件的内容?预先谢谢你。

2 个答案:

答案 0 :(得分:3)

您可以使用bind mount将文件装载到容器中

将目标位置更改为您的应用所需的位置

ngAfterViewInit

答案 1 :(得分:2)

您不应将环境变量存储在容器中。

根据TwelveFactor-

  

十二个因素的应用程序将配置存储在环境变量中(通常缩写为env vars或env)。 Env var易于在部署之间进行更改,而无需更改任何代码。与配置文件不同,它们很少有可能被意外检入代码存储库;与自定义配置文件或其他配置机制(例如Java系统属性)不同,它们是与语言和操作系统无关的标准。

您正确传递了env文件。 env文件的格式必须为<key>=<value>。 例如-

DB_USERNAME=user
DB_PASSWORD=password
DB_SCHEMA=db
DB_PORT=3306
DB_HOST=db

REDIS_HOST=redis
REDIS_PORT=6379
REDIS_DB=0

在您的应用程序中,您无需关心.env文件是否存在,只需阅读环境变量即可。

python中的示例-

import os
db_username = os.environ['DB_USERNAME']

您不应将环境变量耦合到文件。它应该从运行时环境中读取。