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