gpt4 book ai didi

docker - Docker Compose无法启动mongo服务,即使主要服务也依赖于它

转载 作者:行者123 更新时间:2023-12-02 18:45:23 25 4
gpt4 key购买 nike

我正在尝试使用Docker-Compose和bash脚本构建ci进程来构建,测试和发布.NET Core应用程序。

我在文件夹中有UnitTests,IntegrationTests和XApi项目
并创建了DockerFiledocker-compose.yml,如下所示。
IntegrationTests依赖于mongointegration,因此我在links中为depends_on服务添加了testandpublishdocker-compose.yml属性。

当我尝试docker-compose updocker-compose up testandpublish时,
它无法连接mongo。 (DockerFile-步骤10),mongo服务尚未启动(不明白为什么)

在步骤10中,如果将RUN更改为CMD,它可以连接到mongo,则docker-compose可以正常工作。但是这次我无法在我的sh脚本中检测到测试失败或成功,因为现在它不会破坏docker-compose up命令。

我的问题是:为什么docker compose无法启动服务mongointegration?如果不可能,我如何理解testandpublish服务失败?谢谢。

结构体:

XProject
-src
-Tests
-UnitTests
-IntegrationTests
-Dockerfile
-docker-compose.yml
-XApi

我的Dockerfile内容是(我在此处添加了行号来解释问题):
1.FROM microsoft/dotnet:1.1.0-sdk-projectjson
2.COPY . /app
3.WORKDIR /app/src/Tests/UnitTests
4.RUN ["dotnet", "restore"]
5.RUN ["dotnet", "build"]
6.RUN ["dotnet", "test"]
7.WORKDIR /app/src/Tests/IntegrationTests
8.RUN ["dotnet", "restore"]
9.RUN ["dotnet", "build"]
10.RUN ["dotnet", "test"]
11.WORKDIR /app/src/XApi
12.RUN ["dotnet", "restore"]
13.RUN ["dotnet", "build"]
14.CMD ["dotnet", "publish", "-c", "Release", "-o", "publish"]

和我的docker-compose.yml
version: "3"
services:
testandpublish:
build: .
links:
- mongointegration
depends_on:
- mongointegration
mongointegration:
image: mongo
ports:
- "27017:27017"

最佳答案

镜像构建阶段和容器运行阶段是docker-compose中两个非常独立的步骤。

建立和运行差异

构建阶段根据Dockerfile中的步骤创建每个图像层。每种情况都发生在独立容器中。除了特定于服务构建的build:节以外,您的服务配置均在构建期间不可用。

构建镜像后,它可以与其他docker-compose服务配置一起作为容器运行。

除了在Dockerfile中运行测试之外,您还可以创建一个脚本作为CMD来运行容器中所有测试步骤。

#!/bin/sh
set -uex
cd /app/src/Tests/UnitTests
dotnet restore
dotnet build
dotnet test
cd /app/src/Tests/IntegrationTests
dotnet restore
dotnet build
dotnet test"
cd /app/src/XApi
dotnet restore
dotnet build
dotnet publish -c Release -o publish

如果 microsoft/dotnet:1.1.0-sdk-projectjson图像基于Windows,则可能需要将其转换为等效的CMD或PS命令。

容器依赖
depends_on不能像大多数人认为的那样工作。用它的简单形式, depends_on仅在启动依赖容器之前等待容器启动。等待容器内部的过程准备就绪还不够聪明。 Proper dependencies can be done with a healthcheck and a condition
services:
testandpublish:
build: .
links:
- mongointegration
depends_on:
mongointegration:
condition: service_healthy
mongointegration:
image: mongo
ports:
- "27017:27017"
healthcheck:
test: ["CMD", "docker-healthcheck"]
interval: 30s
timeout: s
retries: 3

在通过Dockerfile将其复制到容器中之后,使用 Docker health check script
#!/bin/bash
set -eo pipefail

host="$(hostname --ip-address || echo '127.0.0.1')"

if mongo --quiet "$host/test" --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'; then
exit 0
fi

exit 1

关于docker - Docker Compose无法启动mongo服务,即使主要服务也依赖于它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42643928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com