我正在尝试 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
目录及其后续文件和文件夹。
我知道,已经多次询问过此问题的变体,但是请相信我,我已经尝试了所有这些解决方案。以下是一些问题:
Error response from daemon: OCI runtime create failed: container_linux.go:296
A GitHub issue which looked familiar-仍然没有答案,并且是打开的。
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是否有人想重现该错误。
答案 0 :(得分:1)
将工作目录的子目录5
装入容器内的data
目录时,整个文件夹(包括在其中编译和复制的二进制文件)将不再可用。相反,/proj
目录的内容将在data
上的容器内提供。本质上,您是在“隐藏”目录的容器映像版本,并用容器外部的目录替换它。
这是因为/proj
标志(具有您提供的参数)会创建绑定安装,并将第二个参数(-v
)用作安装目标。
要解决此问题,请将二进制文件复制到其他目录(并相应地更改/proj
指令),或为绑定装入选择其他目标。