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

时间:2018-12-29 18:21:03

标签: docker dockerfile

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

简短摘要(有关代码的作用)-它只是检查是否存在.cache文件夹,如果不存在则创建该文件夹。

在对项目进行docker化之后,我的目标是将路径安装在创建了.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. Error response from daemon: OCI runtime create failed: container_linux.go:296

  2. A GitHub issue which looked familiar-仍然没有答案,并且是打开的。

  3. Another GitHub issue-可能是迄今为止最好的链接,但我仍然无法使它正常工作。

删除音量标志使run命令起作用的事实使我感到非常困惑。

有人可以解释这种情况下的情况,并向我指出正确的方向。

P.S。 -另外,我在MacOS上运行docker(具体来说是macOS High Sierra),我不得不在Docker-> Preferences -> File Sharing中使用主机装载路径启用文件共享(仅提供更多信息!)。

不用说,我还尝试通过尝试触发类似ENTRYPOINT之类的东西来覆盖/bin/sh /proj/project,但该方法也没有用(因为它甚至找不到可执行文件project在提到root的完整路径之后)。我在某处看到alpine图像仅包含sh,而没有bash。在将project转换为image的同时,我也在更改可执行文件a+x的特权,这也不起作用。

请让我知道问题的任何部分是否不清楚。我还检查了我的code here in GitHub是否有人想重现该错误。

1 个答案:

答案 0 :(得分:1)

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

这是因为/proj标志(具有您提供的参数)会创建绑定安装,并将第二个参数(-v)用作安装目标。

要解决此问题,请将二进制文件复制到其他目录(并相应地更改/proj指令),或为绑定装入选择其他目标。