来自守护进程的错误响应: 当前上下文中没有构建阶段

我尝试用 kvm 运行一个容器,使用我在这里找到的代码: < a href = “ https://github.com/jessfraz/dockerfiles/tree/master/kvm”rel = “ norefrer”> https://github.com/jessfraz/dockerfiles/tree/master/kvm 我创建了一个新目录,cd 到其中,并创建了 dockerfile 和 start.sh 文件。 当我下达构建命令时,它输出以下错误消息:

Sending build context to Docker daemon  3.584kB
Error response from daemon: No build stage in current context

我不知道这意味着什么,我也不能谷歌一个答案。 有人帮忙吗?

120216 次浏览

你的 dockerfile 有一个: FROM repo/image

作为第一行?当我忘记指定正在构建的 Docker 映像时,出现了这个错误。

即使您正在构建一个“源映像”,您仍然需要指定 FROM scratch作为 dockerfile 的第一行。

这通常是由于在 FROM 命令之前写入的文本造成的。尝试删除 dockerfile 中的注释并重新构建。

参考 https://github.com/moby/buildkit/issues/164

问题解决了。 当我转到 dockerfile 编辑代码时,我注意到我不小心取消了第一行的注释。愚蠢的错误,我知道。 谢谢你们的帮助。

当你在声明环境变量(ENV)之前声明 FROM时,会出现这个消息。

例如:

# Define variables.
ARG PORT
ENV SERVER_PORT=$PORT


# Install minimal Python 3.
FROM python:3.7-alpine


# Install Python requirements.
COPY requirements.txt /
RUN pip install -r /requirements.txt


# Copy app source code.
COPY src/ /app
...

要解决这个问题,需要交换声明,以便在 FROM之后设置任何环境变量。

# Install minimal Python 3.
FROM python:3.7-alpine


# Define variables.
ARG PORT
ENV SERVER_PORT=${PORT}


# Install Python requirements.
COPY requirements.txt /
RUN pip install -r /requirements.txt


# Copy app source code.
COPY src/ /app
...

根据 文档在 docs.docker.com,Dockerfile 的第一个非注释行必须是 FROM行:

FROM指令初始化一个新的构建阶段,并为后续指令设置 基本图像。因此,有效的 Dockerfile必须以 FROM指令开始。

如果仍然使用不推荐的 MAINTAINER关键字,则必须将 FROM命令作为 Dockerfile中的第一个命令:

BAD :

MAINTAINER your name "your@email.com"
FROM dockerimagename

:

FROM dockerimagename
MAINTAINER your name "your@email.com"

我不认为这是你的情况,但它可能帮助别人与错误。

  1. 我的 Dockerfile 运行时没有出现这个错误。
  2. 我在 Dockerfile 的开头添加了“ FROM vcatechlogy/linux-minux: 18.2”,也没有错误。
  3. 在再次删除 FROM 语句之后,它仍在搜索该语句,从而导致此错误。
  4. 我只能通过再次添加 FROM 语句来消除这个错误。

因此,如果使用了以 FROM 语句开头的 Dockerfile,并且随后再次删除 FROM 语句,则可能会出现此错误。

在我的例子中,我将 RUN 更改为 FROM。

旧码头档案:

RUN php:8-apache


COPY /src var/www/html/


ENV APACHE_DOCUMENT_ROOT ./src/public/


RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf


RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf


EXPOSE 80

新 Dockerfile:

FROM php:8-apache


COPY /src var/www/html/


ENV APACHE_DOCUMENT_ROOT ./src/public/


RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf


RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf


EXPOSE 80

这是我的情况,因为我在 FROM之前指定了 ENV,并且如前所述,FROM应该是 Dockerfile 中的第一个表达式。

但是

由于这个公关 https://github.com/moby/moby/pull/31352你可以指定 ARG之前的 FROM,这可能是适合你的替代品。

所以我变了

ENV MY_VAR 1
FROM ...

ARG MY_VAR=1
FROM ...

顺便说一下,你可以在这里阅读关于 ARG 与 ENV 的差异 https://vsupalov.com/docker-arg-vs-env/