如何挂载Docker容器卷

时间:2020-05-04 18:25:30

标签: python docker docker-compose

我的要求是这样的

问)我有一个python小应用程序,它在docker容器上运行小型flask服务器。我需要将一个值传递给将从python服务器返回的容器。,但我有时需要更改此传递值,并且我不想每次生成映像时更改此传递值。

为此,我完成了此设置.env文件并设置了我需要像下面一样传递的环境变量:

这是我的.env

MY_NAME=John McBeth

这是我的server.py

from flask import Flask
app = Flask(__name__)
import os

PORT = 8083

return_value = os.environ(['MY_NAME']) # value I am getting from .env

@app.route('/')
def hello_world():
    return str(return_value)

if __name__ == '__main__':
   app.run(host='0.0.0.0', port=PORT)

我正在通过docker-compose.yaml构建此文件,如下所示:

version: "3.2"

services:
  backend: 
    build: ./backends/banuka
    environment:
      CHOKIDAR_USEPOLLING: "true"
      MY_NAME: ${MY_NAME} // this is where I am passing the value in `.env`   
    ports: 
      - 8080:8083

问题::如何为该容器设置一个卷,每次我在.env中更改此名称时,它都会在之后立即反映出来,而无需再次构建映像并运行?

2 个答案:

答案 0 :(得分:0)

将您的docker-compose.yml更改为:

version: "3.2"

services:
  backend: 
    build: ./backends/banuka
    volumes:
      - .:/path/to/project
    environment:
      CHOKIDAR_USEPOLLING: "true"
    env_file:
      - .env
    ports: 
      - 8080:8083

您可以根据自己的喜好设置/path/to/project,这将是容器内的路径,.仅表示当前目录,我想这是您项目的根目录,您可以也将此更改为要安装的计算机中的任何路径。

此外,您可以直接使用.env选项来设置env_file文件,这是我的实际建议

https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option

答案 1 :(得分:0)

与docker-compose.yml创建文件
echo "John McBeth" > file_with_env_content

在容器中挂载文件。

version: "3.2"

services:
  backend: 
    build: ./backends/banuka
    volumes:
      - ./file_with_env_content:/opt/file_with_env_content
    environment:
      CHOKIDAR_USEPOLLING: "true"

    ports: 
      - 8080:8083

然后更改您的python脚本以从临时文件中读取内容。

from flask import Flask
app = Flask(__name__)
import os

PORT = 8083

#return_value = os.environ(['MY_NAME']) # value I am getting from .env
f = open("/opt/file_with_env_content", "r")
return_value = f.readline() # Write your logic to select any specific line or key value pair etc.
f.close()


@app.route('/')
def hello_world():
    return str(return_value)

if __name__ == '__main__':
   app.run(host='0.0.0.0', port=PORT)