Docker:在使用卷(-v)标志运行时,守护进程的错误响应:OCI运行时创建失败

Docker:在使用卷(-v)标志运行时,守护进程的错误响应:OCI运行时创建失败,docker,dockerfile,Docker,Dockerfile,我正在尝试将我的第一个Go项目dockerize(尽管我想这个问题与Go无关!) 简短摘要(代码正在执行的操作)-它只需检查.cache文件夹是否存在,如果不存在,则创建该文件夹 将项目对接后,我的目标是将创建.cache的容器中的路径装载到主机路径 这是我的Dockerfile(多级): 编辑:如果我运行类似的操作(如@Jan Garaj在评论中提到的): 不会引发错误,但会在主机上创建一个空的Preferences->file sharing中启用文件共享(只是一个额外的信息!!) 不用说,

我正在尝试将我的第一个
Go
项目dockerize(尽管我想这个问题与Go无关!)

简短摘要(代码正在执行的操作)-它只需检查
.cache
文件夹是否存在,如果不存在,则创建该文件夹

将项目对接后,我的目标是将创建
.cache
的容器中的路径装载到主机路径

这是我的Dockerfile(多级):

编辑:如果我运行类似的操作(如@Jan Garaj在评论中提到的):

不会引发错误,但会在主机上创建一个空的
文件夹,其中没有容器的
.cache
目录中的实际(内容)文件和文件夹。但是,容器中的可执行文件能够创建
.cache
目录及其后续文件和文件夹

我知道,这个问题已经被问了很多次了,但是相信我,我已经尝试了所有这些解决方案。以下是一些问题:

  • -仍然没有答案,并且是开放的

  • -可能是目前为止最好的链接,但我仍然无法让它工作

  • 删除卷标志使
    run
    命令工作的事实让我很困惑。

    有人能解释一下这种情况下发生了什么,并给我指出正确的方向吗。

    另外,我在MacOS上运行docker(具体来说是MacOS High Sierra),我必须使用主机装载路径在
    docker->Preferences->file sharing
    中启用文件共享(只是一个额外的信息!!)

    不用说,我也尝试过重写
    入口点
    ,尝试触发类似
    /bin/sh/proj/project
    的东西,但同样不起作用(因为即使在提到
    根目录的完整路径后,它也找不到可执行的
    项目
    )。我在某个地方读到,
    alpine
    图像只有
    sh
    ,没有
    bash
    。在将
    图像
    构建为
    a+x
    时,我还将可执行文件
    项目
    的权限更改为
    a+x
    ,这也不起作用


    如果问题的任何部分不清楚,请务必告诉我。如果有人想重现错误,我也检查了我的日志

    当您将工作目录的子目录
    data
    装入容器内的
    /proj
    目录时,整个文件夹(包括您在其中编译和复制的二进制文件)将不再可用。相反,您的
    数据
    目录的内容将在
    /proj
    上的容器中可用。本质上,您是在“隐藏”容器映像的目录版本,并将其替换为容器外部的目录

    这是因为
    -v
    标志与您给定的参数一起创建绑定装载,并使用第二个参数(
    /proj
    )作为装载目标


    要解决此问题,请将二进制文件复制到不同的目录(并相应地更改
    入口点
    指令),或者为绑定装载选择不同的目标。

    提示:docker运行什么--rm-v$PWD:/proj--入口点“ls/proj”项目映像:最新
    显示?如果删除
    -v
    选项,会显示什么?@DavidMaze谢谢。我试过上面的方法。使用
    -v
    选项和不使用该选项时,它会抛出以下错误:
    容器\u linux.go:348:启动容器进程导致“exec:\“ls/proj\”:stat ls/proj:没有这样的文件或目录:未知。
    但是,正如我在问题描述中提到的,运行
    docker run--rm project image:latest
    工作正常(即,如果我在不覆盖
    入口点的情况下尝试)。我还是无法理解。那卷书有什么意义“`pwd`/data:/proj
    ?首先,您将构建二进制文件
    /proj/project
    ,然后将使用主机文件夹
    `pwd`/data
    覆盖整个文件夹
    /proj
    。您是否在
    `pwd`/data/project
    中拥有具有正确权限的二进制文件?盲目猜测以获得更好的卷:
    -v“`pwd`/data/.cache:/proj/.cache”
    -它不会覆盖容器
    /proj
    文件夹。@JanGaraj谢谢。我读了最新的评论。是,我的项目二进制文件具有可执行权限。另外,docker run--rm-v“pwd/data/.cache:/proj/.cache”项目映像:latest没有抛出错误。我还创建了
    缓存
    日志。我获得了
    .cache
    文件夹,但仍然没有从容器中获得
    .cache
    文件夹下的文件和文件夹。它总是创建一个空白文件夹。我
    exec
    -检查了容器,并重新检查了是否存在权限问题。当我从容器内部检查时,二进制文件能够创建
    .cache
    文件夹和后续文件。
    FROM golang as builder
    
    ENV GO111MODULE=on
    
    WORKDIR /proj
    
    COPY go.mod .
    COPY go.sum .
    RUN go mod download
    
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
    
    RUN ls
    FROM alpine
    COPY --from=builder /proj/project /proj/
    RUN chmod a+x  /proj/project
    ENTRYPOINT [ "/proj/project" ]
    
     docker run --rm -v "`pwd`/data/.cache:/proj/.cache/"  project-image:latest