有没有可能在构建 Docker 镜像时显示 `WORKDIR`?

73

我们在构建Docker镜像时遇到了WORKDIR的问题。是否可以打印WORKDIR的值?

我们尝试过:

ECHO ${WORKDIR}

但是没有这样的指令 ECHO

6个回答

67

Docker没有内置的方法来在构建过程中打印WORKDIR。您可以通过inspect输出中的.Config.WorkingDir属性检查镜像/层的最终工作目录:

docker image inspect -f '{{.Config.WorkingDir}}' {image-name}

可以通过打印shell的默认工作目录来查看Linux容器构建步骤的工作目录:

RUN pwd

或者shell经常将工作目录存储在PWD环境变量中

RUN echo "$PWD"

如果之前已经运行过RUN步骤并且已缓存,请添加--no-cache标志。 如果您正在使用带有BuildKit的较新版本的Docker,则需要使用--progress=plain启用构建的stdout。
docker build --no-cache --progress=plain . 

14
尝试过使用 RUN pwdCMD pwd,但在构建镜像时控制台没有输出任何内容。它只会输出到容器的控制台。 - A-Sharabiani
1
你是否使用除了Docker之外的工具来构建镜像?或者可能在Docker中使用“-q”或获取缓存的构建? - Matt
@Matt 我认为它不适用于BuildKit(只有执行的命令被打印出来,而没有输出)。 - Wirone
@Wirone 谢谢。您能确认一下修复情况吗?我的 Docker 实例似乎还停留在黑暗时代。 - Matt
@matt RUN pwd 执行 pwd 命令...输出默认被 Docker 构建过程捕获。RUN echo $(pwd) 告诉 RUN 显示 命令的输出。尝试两种方式并自行查看。 - troyfolger
显示剩余4条评论

17

最近有些关于docker build命令的变化,它在构建过程中隐藏了stdout

简而言之,使用DOCKER_BUILDKIT=0 docker build来恢复“旧”的行为。

(参考链接)


10
您可以在 Dockerfile 中使用以下命令。
RUN pwd && ls

使用--progress=plain选项运行构建

docker build -t <image-name-you-want-to-give> --progress=plain .

9

在构建步骤期间,您可以检查目录的内容并使用类似的命令打印它:

RUN ls
RUN ls ..

在 Ubuntu 20.04.4 LTS WSL2 上,我需要将 --progress=plain 与 debug 模式和 no-cache 结合使用才能看到输出:
docker -D build --progress=plain --no-cache. 

3
这也不起作用。它只显示命令的sha而不是实际的echo输出。 - Syed Saad

1

如果我使用 docker-compose up,RUN 不会在我的 IDE 控制台中打印。 但是 CMD 会。所以尝试一下

CMD pwd

如果镜像中有 Python,则这也应该可以工作

CMD ["python", "-c", "import os;print(os.getcwd())"]

请注意,在“容器运行”阶段只有最后一个 CMD 命令将被执行。所有其他命令都将被静默忽略。另一方面,有一个标准的管道解决方法:

CMD pwd && ls


1
我在我的Dockerfile中添加了以下行:

RUN pwd

然后使用以下命令打印当前工作目录并构建镜像:
docker compose build --no-cache <name of service> 2>&1 | tee build.log

这将以更详细的格式在终端中打印输出,并在文件 build.log 中完成完整的日志记录。

如果您不使用 docker compose,我希望您能够使用类似的 docker 命令执行类似操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接