【问题标题】:How to add host cache directory to docker image when building?构建时如何将主机缓存目录添加到docker镜像?
【发布时间】:2019-08-02 18:53:00
【问题描述】:

我对码头工人比较新鲜。 我的网络不好。每次构建asp.net core项目时,总是卡在dotnet restore这一步。

因为项目引用 abp myget nightly。错误信息:

步骤 8/9:运行 dotnet restore "IC.AuthServer.csproj" ---> 在 4232f5677921 中运行 无法从“https://www.myget.org/F/abp-nightly/api/v3/flatcontainer/volo.abp.core/0.19.0-preview20190724/volo.abp.core.0.19.0-preview20190724.nupkg”下载包“Volo.Abp.Core.0.19.0-preview20190724”。 无法建立 SSL 连接,请参阅内部异常。 无法从传输连接读取数据:连接被对等方重置。 对等方重置连接 无法从“https://www.myget.org/F/abp-nightly/api/v3/flatcontainer/volo.abp.identityserver.domain.shared/0.19.0-preview20190724/volo.abp.identityserver.domain.shared.0.19.0-preview20190724.nupkg”下载包“Volo.Abp.IdentityServer.Domain.Shared.0.19.0-preview20190724”。 无法建立 SSL 连接,请参阅内部异常。 无法从传输连接读取数据:连接被对等方重置。

我在 ~/.nuget/ 获得了 abp 包。我尝试将其复制到 docker。但复制不支持绝对路径。通过我可以将它复制到当前上下文目录。但是太丑了。

构建镜像时有没有办法挂载主机目录?

提前致谢。

这里是 Docker-compose.yml:

version: "3"
services:
  db-mysql:
    image: mysql
    ports:
      - "3308:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - mysql_init_files:/docker-entrypoint-initdb.d
    environment: 
      MYSQL_DATABASE: "Coriander_Account"
      MYSQL_ROOT_PASSWORD: "123456"

  auth-server:
    build:
      context: ./
      dockerfile: Applications/IC.AuthServer.Host/Dockerfile
    depends_on: 
      - db-mysql
    ports: 
      - "6001:80"

volumes: 
  mysql_data:
  dbdata:
  mysql_init_files:

这里是 Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY . .
WORKDIR "/src/Applications/IC.AuthServer.Host/"

// * I want to let docker mounting host directory at here. * 

RUN dotnet restore "IC.AuthServer.csproj"
RUN dotnet build "IC.AuthServer.csproj" -c Release -o /app

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "IC.AuthServer.dll"]

【问题讨论】:

    标签: c# docker caching nuget


    【解决方案1】:

    构建镜像时有没有办法挂载主机目录?

    无法在构建期间安装主机卷(请参阅response)。但是,您可以在第一个磁盘空间低效阶段使用multistage builds 并“挂载”您的主机目录,然后在最后一步复制您需要的内容:

    FROM ubuntu as intermediate
    COPY myFiles /myFiles
    RUN ... # some expensive operation
    
    FROM ubuntu
    COPY --from=intermediate /result /result
    # simply use the result
    

    【讨论】:

    • 我的项目是 /home/user/workspace/CloudStorage/docker-compose.yml ,缓存路径是 /home/user/.nuget 。根据您的操作,我必须将.nuget目录复制到/home/user/workspace/CloudStorage/.nuget?是吗?
    • 一个解决方案是COPY /home/user/workspace/CloudStorage/.nuget /nuget。您的nuget 文件夹将被复制到/nuget 的docker 容器中
    • 我用你的方式测试。但是复制绝对路径是行不通的。它将特殊一个临时路径。错误:构建失败:复制失败:stat /var/lib/docker/tmp/docker-builder494280566/home/echo/.nuget:没有这样的文件或目录
    • 可能是因为您将上下文之外的路径用于 ADD/COPY 命令。您应该使用构建上下文中的相对路径。另见github.com/docker/for-mac/issues/1922#issuecomment-491245969
    • 感谢 Thibaud,我从 Docker-Compose 运行 Dockerfile。我会补充我的答案。
    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2016-11-08
    • 2020-09-03
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多