我想使用env文件中定义的端口号,可以吗?
以下是我的docker-compose.yml的内容:
version: '3'
services:
flask:
build:
context: ./flask
dockerfile: Dockerfile_flask
env_file:
- env_file.env
ports:
#- "5000:5000"
- "${PORT}:${PORT}" # I want to set port defined in the env file
volumes:
- ./logs:/app/flask/log
restart: always
这是env_file.env的内容
PORT=5000
但是出现了一些错误:
WARNING: The PORT variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.flask.ports is invalid: Invalid port ":", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
如果有可能,我应该怎么做?谢谢
@lvthillo,感谢您之前的回复。但是我还有另一个问题,就是我的 flask 应用程序无法访问该端口。代码如下所示
import os
from flask import Flask
application = Flask(__name__)
print(os.getenv("PORT")) # this is None
my_port = int(os.getenv("PORT", 5000)) # so my_port here is 5000, but I want it to be 5002 defined in .env
@application.route("/api/test", methods=['POST'])
def index():
print('hello')
if __name__ == "__main__":
application.run(host="0.0.0.0", port=my_port)
因为flask应用程序需要在与容器相同的端口上运行。有什么办法可以在docker-compose和flask应用程序的env文件中设置端口?谢谢
最佳答案
env_file
optin将仅在docker容器本身中设置环境变量。不在撰写“build”期间使用的主机上。
要将端口定义为env var,应使用here所述的.env
文件
在您的情况下,创建一个.env
文件,其中包含:
PORT=5000
和
docker-compose.yml
:version: '3'
services:
flask:
build:
context: ./flask
dockerfile: Dockerfile_flask
ports:
#- "5000:5000"
- "${PORT}:${PORT}" # I want to set port defined in the env file
volumes:
- ./logs:/app/flask/log
restart: always
如果要使用env_file将环境变量添加到容器中,则可以再次添加它。
为了使这个例子更清楚:
Postgres开始撰写。
my-env-file
中的环境变量在容器内是已知的,.env
内的env var在docker-compose up
过程中使用。带有以下内容的
.env
文件:PORT=5432
带有以下内容的
my-env-file
:POSTGRES_USER=dev
POSTGRES_PASSWORD=secret
POSTGRES_DB=db
和
docker-compose.yml
:version: ‘3.3’
services:
postgres:
image: postgres:9.6
container_name: postgres
env_file:
- my-env-file
ports:
- ${PORT}:${PORT}
关于docker - 如何从env_file获取docker-compose的端口?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52664673/