ChatGPT解决这个技术问题 Extra ChatGPT

Docker构建给出“无法准备上下文:上下文必须是一个目录:/Users/tempUser/git/docker/Dockerfile”

我有一个应该构建 Ubuntu 映像的 Dockerfile。但每当我跑步

docker build -t ubuntu-test:latest ./Dockerfile

它在控制台上显示以下错误

无法准备上下文:上下文必须是目录:/Users/tempUser/git/docker/Dockerfile

我在 Mac OsX 上。我也尝试过sudo。没有任何效果。

我发现有趣的是,没有一个答案能解释 为什么 它不起作用,尤其是当 docker build documentation 明确表示它会:“而不是指定上下文,您可以在URL”和“如果使用 STDIN 或指定 URL 指向纯文本文件,系统会将内容放入名为 Dockerfile 的文件中,并且忽略任何 -f--file 选项。在这种情况,没有上下文。”

g
gorgabal

您需要改为指向该目录。您不得指定 dockerfile。

docker build -t ubuntu-test:latest . 确实工作

docker build -t ubuntu-test:latest ./Dockerfile不起作用


为什么会这样?当您可以轻松地将其指向文件本身时,需要指向一个目录似乎很奇怪
根据@JakubKnejzlik 的以下回答,您可以使用 -f 标志指向一个文件(然后仍然引用一个目录,通常使用 .,因此 docker 仍然具有它想要的上下文)
仍然得到错误:unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/kes/work/projects/sidnet/chimera/Chimera-DevEnv/Chimera/Dockerfile: no such file or directory
J
JakubKnejzlik

您还可以使用 -f 选项运行 docker build

docker build -t ubuntu-test:latest -f Dockerfile.custom .


这对我有用。在我的例子中 Dockerfile 名称是 Dockerfile-abcd 所以我不得不解雇:docker build -t my-custom-name -f /path_to_my_docker_file/Dockerfile-abcd .
r
rimalroshan

了解上下文

docker 构建命令

docker的构建命令的基本语法是

docker build -t imagename:imagetag context_dir

上下文

上下文是一个目录,它决定了 docker 构建过程将看到什么:从 Dockerfile 的角度来看,文件系统中的任何文件 context_dir/mydir/myfile 都将成为 Dockerfile 中的 /mydir/myfile,因此在构建过程中。

码头工人文件

如果 dockerfile 被称为 Dockerfile 并存在于上下文中,它将通过命名约定隐式找到。这很好,因为这意味着您通常可以立即在任何 docker 容器中找到 Dockerfile。

如果您坚持使用不同的名称,例如“/tmp/mydockerfile”,您可以像这样使用 -f

docker build -t imagename:imagetag -f /tmp/mydockerfile context_dir

但是 dockerfile 不会在同一个文件夹中,或者至少会更难找到。


s
shizhz

要在构建时指定 Dockerfile,您可以使用:

docker build -t ubuntu-test:latest - < /path/to/your/Dockerfile

但如果有依赖于相对路径的 ADDCOPY 命令,它将失败。有多种方法可以为 docker build 指定 context,您可以参考 docs of docker build 了解更多信息。


ubuntu 12.04 执行此操作:docker build -t ubuntu:12.04 - < Dockerfile您必须位于 Dockerfile 的根目录中
B
BMitch

我面临同样的问题。我正在使用 docker version:17.09.0-ce

我遵循以下步骤:

创建 Dockerfile 并添加用于创建 docker 映像的命令转到我们创建 Dockfile 的目录,执行以下命令 $ sudo docker build -t ubuntu-test:latest 。

它解决了问题并成功创建了图像。

注意:构建命令取决于 docker 版本以及我们使用的构建选项。 :)


P
Prashanth

很简单,每当 Docker build 运行时,docker 想知道镜像名称是什么,所以我们需要传递 -t : 。现在确保您位于拥有 Dockerfile 并运行的同一目录中

docker build -t <image_name>:<version> . 示例 docker build -t my_apache:latest . 假设您与 Dockerfile 位于同一目录中,否则传递 -f 标志和 Dockerfile。

docker build -t my_apache:latest -f ~/Users/documents/myapache/Dockerfile


为了让第二个命令为我运行,我不得不稍微改变它:docker build -t my_apache:latest -f ~/Users/documents/myapache/Dockerfile(注意最后添加了一个 .
D
Dheeraj Kumar

我收到错误的原因之一是文件名确保文件名是 Dockerfile 所以我想通了,希望它可以帮助某人。