我是 docker、kubernetes 等的新手。我正在尝试设置 docker 环境,只是为了测试 Hello World!项目(假设从 Node.JS 开始)只是为了了解它是如何工作的。
目前,我唯一可行的临时结论是:WSL2+docker 不起作用。
我在 stackoverflow 等上花了几个小时才发现似乎没有一个能够实现 docker 的基本目的:构建一个简单的镜像(...然后部署它,也许使用 kubees&co 并执行基本的 curl 测试)。
为什么它不能开箱即用?这是一个笑话还是只是我的情况有一些无人注意的问题?
步骤
我创建了一个简单的项目:
Dockerfile:
FROM node:latest
RUN mkdir -p /dockerHelloJS
WORKDIR /dockerHelloJS
COPY index.js .
ENTRYPOINT ["node"]
index.js
const express = require("express");
const app = express();
const port = process.env.HELLO_PORT || '8080';
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Started on port ${port}`);
});
注意:如果有语法错误,请原谅我,因为我还没有机会测试它!...
然后,我天真地在项目目录中尝试了以下命令:
docker build .
这会导致与不存在的目录结构甚至卷等相关的错误:
------
> [1/4] FROM docker.io/library/node:latest@sha256:14bd39208dbc0eb171cbfb26ccb9ac09fa1b2eba04ccd528ab5d12983fd9ee24:
------
Dockerfile:1
--------------------
1 | >>> FROM node:latest
2 |
3 | RUN mkdir -p /dockerHelloJS
--------------------
ERROR: failed to solve: failed to register layer: error creating overlay mount to /var/lib/docker/overlay2/36a15fcda54210377bd4ae1b54d536119dca9b5b7558e33283a90d8bcab27305/merged: too many levels of symbolic links
确实:
$ namei /var/lib/docker/overlay2/36a15fcda54210377bd4ae1b54d536119dca9b5b7558e33283a90d8bcab27305/merged
f: /var/lib/docker/overlay2/36a15fcda54210377bd4ae1b54d536119dca9b5b7558e33283a90d8bcab27305/merged
d /
d var
d lib
docker - No such file or directory
好吧,坦率地说,如果 /var/lib/docker 不存在,那仅仅意味着 docker 的 WSL2 安装不起作用,故事结束了。修补有问题的业务不是由用户来完成的。
只是为了介绍我为了达到这一点而首先所做的事情:
现在,我可以在创建一个似乎没有感觉的 docker 目录后,继续思考如何通过绑定到 /mnt/docker-desktop-data/data/docker 来挂载 /var/lib/docker 的一系列问题首先必须存在(这提出了为什么存在的问题)。为什么我们需要两个 docker 安装:一个在其正确的虚拟机中,另一个在任意数量的附加虚拟机中,我是否应该 sudo 我的 docker 命令,因为 /var/lib/docker 将是 root 拥有的挂载点(或者可能是它已经被su-id'ed了),等等,等等。但是谁在乎呢?只有一个有效问题:
问题
有人设法从 WSL2 Linux VM 构建一个项目吗?此时,即使在其他情况下也可以(我将尝试从我的 Windows 主主机进行 docker 构建,而不是使用 cmd)。
如果有人这样做了,请您慷慨地分享一下吗?
谢谢!
我并不自豪地报告在对 docker-desktop 执行完全清除和出厂重置并重新启动后,最终在 Ubuntu 和 Windows 下成功构建了(因为 docker 不会重新启动,而且我发现没有可操作的按钮或命令除了执行通常的windoze重启之外,还要这样做...)。
我并不骄傲,因为我一开始就不明白为什么它不起作用。
我可以确认 Ubuntu 本地 /var/lib/docker 目录或挂载点仍然不存在。无论如何,cmd docker 构建都给了它可用:它还希望该目录存在,这在 Windows 下是无意义的。
所以到目前为止,我不明白其背后的魔力(研究了一天后,没关系,我接受它)。
这也意味着,到目前为止以及我浏览过的 stackoverflow&co 页面中都没有解释为什么它不起作用。没有任何明确的方法来调查该问题。 /var/lib/docker 不存在于任何虚拟机上。因此,它要么是 Linux docker 安装的痕迹,要么是 Windows 版本中的一些神奇占位符,要么是其他东西。而且,这也意味着它可能会再次弹出,而手头只有一种解决方案:清除所有内容并重新启动。非常有前途。
欢迎任何解释,因为我不会假装在这里提供了任何有价值的东西。
提前致谢。