首页 > 解决方案 > Docker:使用卷(-v)标志运行时来自守护进程的错误响应:OCI 运行时创建失败

问题描述

我正在尝试对我的第一个项目进行docker 化Go(尽管我猜这个问题与 Go 无关!)。

简短摘要(代码正在做什么) - 它只是检查.cache文件夹是否存在,如果不存在则创建它。

将项目码头化后,我的目标是将创建的容器中的路径挂载到主机路径.cache

这是我的 Dockerfile(多阶段):

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" ]

编辑:如果我运行这样的事情(正如评论中提到的@Jan Garaj):

 docker run --rm -v "`pwd`/data/.cache:/proj/.cache/"  project-image:latest

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

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

  1. 来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:296

  2. 一个看起来很熟悉的 GitHub 问题- 仍然没有答案并且是开放的。

  3. 另一个 GitHub 问题- 可能是迄今为止最好的链接,但我仍然无法让它工作。

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

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

PS - 另外,我在 MacOS(具体来说是 macOS High Sierra)上运行 docker,我必须启用Docker-> Preferences -> File Sharing与主机挂载路径的文件共享(只是一个额外的信息!!)。

不用说,我也尝试过ENTRYPOINT通过尝试触发同样不起作用的东西来覆盖(因为即使在提到完整路径之后/bin/sh /proj/project它也找不到可执行文件)。我在某处读到该图像只有并且没有. 我还在构建to时更改了可执行文件的权限,这也不起作用。projectrootalpineshbashprojectimagea+x

如果问题的任何部分不清楚,请告诉我。如果有人想重现该错误,我还在 GitHub 中检查了我的代码。

标签: dockerdockerfile

解决方案


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

这是因为-v带有您给它的参数的标志创建了一个绑定挂载并使用第二个参数 ( /proj) 作为挂载目标。

要解决这个问题,要么将二进制文件复制到不同的目录(并ENTRYPOINT相应地更改指令),要么为绑定挂载选择不同的目标。


推荐阅读