我有一个像下面的文件夹结构:

[Services]
|
+--[IdentityService] (this folder contains Docker & docker-compose file)
|
+--[ProductService]  (this folder contains Docker & docker-compose file)
|
+--[ApiGateway]  (this folder contains Docker & docker-compose file)
|
+--docker-compose.yml

这是我的Different Docker文件:

1] ApiGateway - Docker文件

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 9000
ENV ASPNETCORE_URLS=http://+:9000

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY ["APIGateway.csproj", "./"]
RUN dotnet restore "./APIGateway.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "APIGateway.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "APIGateway.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
#ENTRYPOINT ["dotnet", "APIGateway.dll"]
ENTRYPOINT ["dotnet", "APIGateway.dll", "--server.urls", "http://0.0.0.0:9000"]

2] IdentityService - Dockerfile

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 9001
ENV ASPNETCORE_URLS=http://+:9001

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["WebApi.csproj", "./"]
RUN dotnet restore "./WebApi.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "WebApi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "WebApi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
#ENTRYPOINT ["dotnet", "WebApi.dll"]
ENTRYPOINT ["dotnet", "WebApi.dll", "--server.urls", "http://0.0.0.0:9001"]

3] ProductService - Dockerfile

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 9002
ENV ASPNETCORE_URLS=http://+:9002

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["Product.API.csproj", "./"]
RUN dotnet restore "./Product.API.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "Product.API.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "Product.API.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
#ENTRYPOINT ["dotnet", "Product.API.dll"]
ENTRYPOINT ["dotnet", "Product.API.dll", "--server.urls", "http://0.0.0.0:9002"]

我的docker-compose.yml如下所示:“

version: "3"
services:
  api_gateway:
    image: cog/mfp_api_gateway
    build:
      context: .
      dockerfile: Services/ApiGateway/ApiGateway/Dockerfile
    ports:
      - "8082:9000"
    depends_on:
      - identity_service
      - product_service

  identity_service:
    image: cog/mfp_identity_service
    build:
      context: .
      dockerfile: Services/IdentityService/Dockerfile
    ports:
      - "8080:9001"
    depends_on:
      - db

  product_service:
    image: cog/mfp_product_service
    build:
      context: .
      dockerfile: Services/ProductService/Dockerfile
    ports:
      - "8081:9002"
    depends_on:
      - db

  db:
    image: "mcr.microsoft.com/mssql/server:2017-latest"
    environment:
        SA_PASSWORD: "MYPASSWORD"
        ACCEPT_EULA: "Y"
    ports:
      - "1433:1433"
    volumes:
      - ./.db:/var/opt/mssql/
      - /var/opt/mssql/data

在这里,当我单独运行docker文件时,所有文件都正在构建并正常运行。但是,当我可以运行外部docker-compose.yml时,我收到了与PATH相关的错误。我需要在docker-compose.yml文件中指定相对路径吗?

分析解答

Dockerfile中的Docker命令(更具体地说是COPY)与当前的docker上下文相关。

当您单独构建映像时,我猜您从每个Services/<service>目录运行docker build,这意味着上下文是该特定目录。

当您通过 docker-compose,构建它们时,您明确表示上下文是.,这意味着您的docker-compose.yml所在的目录。

只需更改构建的上下文,您应该得到预期的结果=> context: ./Services/<service>。您可以使用默认名称删除dockerfile声明。