如何正确组合这个 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?的主要内容,如果未能解决你的问题,请参考以下文章