当前位置: 首页 > 面试题库 >

如何从env_file获取docker-compose的端口?

赵珂
2023-03-14
问题内容

我想使用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,感谢您之前的回复。但是我还有另一个问题,就是我的烧瓶应用程序无法访问该端口。代码如下所示

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选择启用将只在泊坞窗容器本身设置环境变量。不在撰写“ build”期间使用的主机上。

要将端口定义为env var,应使用此处.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从compose开始。中的环境变量在my-env-file容器内部是已知的,.env在此docker- compose up过程中使用env var内部。

具有以下内容的.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容器中运行任务。而且我编写了一个管理器应用程序来管理容器(启动任务,停止任务,获取状态等)。容器启动后,它将向管理器发送一个http请求及其地址和端口,因此管理器将知道如何管理该容器。 由于同一主机上可能运行着多个容器,因此它们将被映射到不同的端口。要在我的经理上注册一个容器,我必须知道每个容器映射到哪个端口。 如何 在 Docker容器中获取映射的端

  • 我有一台安装了PostgreSQL的服务器。我的所有服务都在容器中工作(docker-compose)。我想从容器中使用我的主机PostgreSQL。但是我有错误: 我的docker compose使用主机网络模式,如下所示: 我的数据库连接URL是:jdbc:postgresql://localhost:5432/shop-bd

  • 我可能做错了什么,但我会在这里问一下,以防万一,因为我找不到它。基本上,当我在pc上运行docker映像时,我没有问题,我只是做“Docker-compose run...”从ruby应用程序目录中。然而,当我将图像推到docker-hub时,我想在我的ubuntu服务器上拉出该图像,然后构建该图像。问题是,当我这么做的时候,我实际上没有权限访问ruby应用程序、gemfile或任何东西,所以它根

  • 编辑:关于我遵循的安装说明,我没有使用PIP。我使用了文档化的curl命令:

  • 所以我想开始使用Jenkins构建我的应用程序,然后测试它,并将我的图像推送到本地repo。因为我有两张图片要推送,我想使用docker compose,但docker compose缺失。 我通过Portainer安装了Jenkins,我使用的是jenkins/jenkins: lts映像。 有没有一种方法可以将docker compose安装到容器中,而不必为其创建自己的docker文件? 到

  • 在正常视图中,我们可以有 在Jetpack Compose中,我只能找到修饰符中的,它只从中获取操作。 Jetpack Compose是否有等效的?