docker - 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
目录及其后续文件和文件夹。
我知道,这个问题的变体已经被问过很多次了,但是相信我,我已经尝试了所有这些解决方案。以下是一些问题:
一个看起来很熟悉的 GitHub 问题- 仍然没有答案并且是开放的。
另一个 GitHub 问题- 可能是迄今为止最好的链接,但我仍然无法让它工作。
删除卷标志使run
命令工作的事实让我很困惑。
有人可以解释一下在这种情况下发生了什么,并指出我正确的方向。
PS - 另外,我在 MacOS(具体来说是 macOS High Sierra)上运行 docker,我必须启用Docker-> Preferences -> File Sharing
与主机挂载路径的文件共享(只是一个额外的信息!!)。
不用说,我也尝试过ENTRYPOINT
通过尝试触发同样不起作用的东西来覆盖(因为即使在提到完整路径之后/bin/sh /proj/project
它也找不到可执行文件)。我在某处读到该图像只有并且没有. 我还在构建to时更改了可执行文件的权限,这也不起作用。project
root
alpine
sh
bash
project
image
a+x
如果问题的任何部分不清楚,请告诉我。如果有人想重现该错误,我还在 GitHub 中检查了我的代码。
解决方案
当您将工作目录的子目录挂载data
到/proj
容器内的目录时,整个文件夹,包括您在其中编译和复制的二进制文件,将不再可用。相反,您的data
目录的内容将在您的容器中可用/proj
。本质上,您正在“隐藏”容器映像的目录版本,并将其替换为容器外部的目录。
这是因为-v
带有您给它的参数的标志创建了一个绑定挂载并使用第二个参数 ( /proj
) 作为挂载目标。
要解决这个问题,要么将二进制文件复制到不同的目录(并ENTRYPOINT
相应地更改指令),要么为绑定挂载选择不同的目标。
推荐阅读
- push-notification - 当外部用户(不是 G-Suite)更改共享云端硬盘内容时,有什么方法可以接收通知?
- codeigniter - 更新 CodeIgniter 的版本
- python - for循环的python进度 - juypter
- twilio - 来自 twilio Studio 流程的 Messagesid
- python - 将 TypeScript 连接到 python
- python - 如何摆脱烦人的非致命错误?
- cmake - 在 luarocks 中安装 cutorch 时出现“错误生成文件”
- r - 如何从固定值开始进行“滚动”乘法
- reactjs - 如何在 SLDSGlobalHeader 组件的徽标中创建链接?
- regex - 正则表达式匹配前 3 个数字