如何正确组合这个 docker-compose.yml?

Posted

技术标签:

【中文标题】如何正确组合这个 docker-compose.yml?【英文标题】:How do I put together this docker-compose.yml properly? 【发布时间】:2021-11-29 17:03:02 【问题描述】:

在这个 docker-compose.yaml 中,我尝试将 prometheus、grafana 和我的应用程序组合到一个 compose 文件中。 我对 prometheus 和 docker-compose 没有太多经验,所以我决定在堆栈上发布我的第一个问题。 我尝试使用 docker-compose prometheus 从 docker 容器中提取指标,但它不起作用。他们很可能在不同的网络中运营。

version: '3.7'

volumes:
    prometheus_data: 
    grafana_data: 

networks:
  front-tier:
  back-tier:

services:
  fastapi:
    image: tiangolo/uvicorn-gunicorn-fastapi:python3.8
    ports:
        - 80:80
    volumes:
        - ./app:/app
    working_dir: /app
    command:
        - 'pip install --no-cache-dir --upgrade -r requirements.txt'
        - 'uvicorn app.main:app --host 0.0.0.0 --port 80'
    restart: always
    
  prometheus:
    image: prom/prometheus:v2.1.0
    volumes:
      - ./prometheus/:/etc/prometheus/
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    ports:
      - 9090:9090
    networks:
      - back-tier
    restart: always
  node-exporter:
    image: prom/node-exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command: 
      - '--path.procfs=/host/proc' 
      - '--path.sysfs=/host/sys'
      - --collector.filesystem.ignored-mount-points
      - "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
    ports:
      - 9100:9100
    networks:
      - back-tier
    restart: always
    deploy:
      mode: global
  grafana:
    image: grafana/grafana
    user: "472"
    depends_on:
      - prometheus
    ports:
      - 3000:3000
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning/:/etc/grafana/provisioning/
    env_file:
      - ./grafana/config.monitoring
    networks:
      - back-tier
      - front-tier
    restart: always

我收到的警告docker-compose up

ERROR: for fastapi Cannot start service fastapi: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "pip install --no-cache-dir --upgrade -r requirements.txt": executable file not found in $PATH: unknown. ERROR: Encountered errors while bringing up the project.

【问题讨论】:

所有文件和文件夹都在同一个文件夹中。 dev.to/aheissenberger/… 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

错误是因为为fastapi提供的命令造成的。

docker-compose 中的command 配置覆盖了默认命令,只能有一个命令指令。 文档:https://docs.docker.com/compose/compose-file/compose-file-v3/#commandhttps://docs.docker.com/engine/reference/builder/#cmd

您为 fastapi 构建服务的方式需要更新:

使用 dockerfile 扩展映像 tiangolo/uvicorn-gunicorn:python3.8 并使用它来安装 requirements.txt 并运行服务器。

# Dockerfile
FROM tiangolo/uvicorn-gunicorn:python3.8

WORKDIR /app

COPY ./app /app

RUN pip install --no-cache-dir --upgrade -r requirements.txt

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

并为 fastapi 更新 docker-compose。为 fastapi 添加任何其他配置。

services:
  fastapi:
    build: .
    ports:
        - 80:80
    restart: always
    # add network configuration if needed

您可以在 README here 上找到有关 uvicorn-gunicorn-fastapi-docker 的更多信息。

【讨论】:

您不需要 volumes: 块,因为代码已经在 Docker 镜像中(拥有它意味着您没有运行镜像中内置的代码,这意味着您将运行部署应用程序时未经测试的图像)。如果您使用默认名称Dockerfile(大写D),那么您也可以使用简写build: . 语法。 @David Maze 是的,你是对的。如果我对音量有误,请纠正我。通过挂载,我可以让 fastapi 拥有最新的代码,而无需重新启动服务,对吗?图像只有在构建后才会有最新的代码。因此,与其为我所做的每项更改重新启动和构建映像,卷安装不会有帮助吗? 无论如何,您每次都必须重新启动应用程序。如果您要使用卷来覆盖映像中的整个应用程序内容,那么像 Python 虚拟环境这样的轻量级设置将允许您在不重新构建 Docker 映像的情况下运行本机主机代码,但仍然可以安装它与其他 Python 分开。

以上是关于如何正确组合这个 docker-compose.yml?的主要内容,如果未能解决你的问题,请参考以下文章

如何让组合框将正确的值传递给表?

如何正确组合两个实时数据对象

Tkinter 如何正确设置组合框滚动条的样式

如何按从最少尝试到最多尝试的顺序获得一系列布尔组合?

如何将选择器与 JavaScript 标识符正确组合?

如何将多个驱动程序与 RxSwift 正确组合?