Docker构建引用不同文件夹中项目的.net核心应用程序

时间:2019-01-25 01:46:04

标签: docker .net-core dockerfile

我正在尝试编写一个构建.NET Core 2.2控制台应用程序project-microservice-logger.csproj的Dockerfile。我遇到一些构建错误,我相信这是因为我要构建的Dockerfile位于包含project-microservice-logger.csproj

的目录中

但是该项目对位于不同目录中的项目有一些引用。

/company/project-common/project-common-database/project-common-database.csproj
/company/project-microservices/project-microservice-logger/project-microservice-logger.csproj

发出命令时,在/company/project-microservices/project-microservice-logger目录中时,我收到类似

的错误
  

名称空间中不存在类型或名称空间名称'Common'

因为我可以很好地构建它,所以我知道它具有某些东西,这是由于Dockers构建上下文所致,并且找不到文件。

我的Docker文件没什么特别的,基本上只是从一些在线可用的.NET Core Docker模板中提取的。

FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:2.2-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "logging.dll"]

如果它对于将来的持续部署情况是一个更好的解决方案,则我愿意改变我们对项目引用的方式。

所有代码都在一个存储库中,但目前分为不同的解决方案(核心,微服务和Web)

版本
.NET Core 2.2
Docker for Mac /版本2.0.0.2

1 个答案:

答案 0 :(得分:0)

我将publish逻辑放入shell脚本中,并且docker映像使用从中构建的文件作为其代码库。

此脚本采用以下文件夹结构:

  

Solution-Folder / build / this-build-script.sh
  解决方案文件夹/MyProject/MyProjectName.csproj

BUILD_MODE="Release"
DOCKER_IMAGE_TAG="latest"

readonly BUILD_MODE
readonly DOCKER_IMAGE_TAG

publish_and_build_image()
{
  PROJECT_DIR=$1
  PROJECT_FILE_NAME=$2
  DOCKER_IMAGE_NAME=$3

  echo "Publishing project $PROJECT_FILE_NAME ..."
  echo
  dotnet publish "..\\$PROJECT_DIR\\$PROJECT_FILE_NAME" --configuration $BUILD_MODE --verbosity quiet

  echo "Building docker image $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG ..."
  docker build --tag=$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG "../$PROJECT_DIR" --quiet

  #echo
  #echo -e "\033[32m $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG built \033[0m"
}

publish_and_build_image "MyProject" "MyProjectName.csproj" "my-docker-img-name"