【问题标题】:RUN command cannot access volumesRUN 命令无法访问卷
【发布时间】:2017-12-23 22:31:18
【问题描述】:

它出现在dockerfile 中的RUN 看不到我的卷目录,而ENTRYPOINT 可以。

这是一个带有问题的dockerfiledocker-compose.yml 示例:

FROM microsoft/dotnet:2.0-sdk
EXPOSE 5000
ENV ASPNETCORE_ENVIRONMENT=Development
WORKDIR /src/testing
RUN dotnet restore
ENTRYPOINT ["dotnet", "run", "--urls=http://0.0.0.0:5000"]

docker-compose.yml:

version: "3.4"

services:
  doctnetcore-api-project:
    build: ./api/
    container_name: doctnetcore-api-project
    image: doctnetcore-api-project:development
    restart: 'always'
    networks:
      - mynetwork
    volumes:
      - /api/src:/src

networks:
  mywebmc:
    external:
      name: mynetwork

当我运行docker-compose up 时,我收到如下所示的错误:

MSBUILD : error MSB1003: Specify a project or solution file. The current working directory does not contain a project or solution file.
ERROR: Service 'doctnetcore-api-project' failed to build: The command '/bin/sh -c dotnet restore' returned a non-zero code: 1

如果我注释掉RUN dotnet restore 并在运行docker-compose 之前手动运行dotnet restore,它可以正常工作。

所以无论出于何种原因,RUN 无法看到我的卷目录,而ENTRYPOINT 可以看到我的卷目录。

【问题讨论】:

  • 您是否希望卷的内容成为用于标识容器的哈希的一部分,这样当这些内容发生变化时,dotnet restore 命令会被重新调用?如果是这样,您根本不希望它成为一个卷,而是希望以一种将其视为容器状态的一部分的方式复制它。

标签: docker asp.net-web-api2 .net-core docker-compose dockerfile


【解决方案1】:

Dockerfile 中的语句在构建时间 (docker build) 执行,此时不存在卷。

相比之下,ENTRYPOINT 在您运行一个可以访问潜在映射卷的容器 (docker run) 时执行。

【讨论】:

  • 那么有什么办法可以做到这一点吗?
  • 您可以将您的 .NET 项目添加到 Dockerfile 所在的文件夹中。这将使它在构建过程中可用。
  • 取决于你所说的“这个”是什么意思。您是否只想确保在dotnet run 之前调用dotnet restore?然后将两个命令折叠到您的 ENTRYPOINT 中,就可以了。
  • 我没有意识到您可以使用 ENTRYPOINT 运行多个命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
相关资源
最近更新 更多