【问题标题】:What directory does a Docker build start in?Docker 构建从哪个目录开始?
【发布时间】:2017-05-26 23:46:46
【问题描述】:

我有一个 Dockerfile,其中包含以下指令:

FROM node:alpine
RUN cd /tmp && \
  # several lines downloading/installing packages from zips

...

ADD src/config.json /myapp/config.json

WORKDIR /myapp

这旨在从应用程序存储库的根目录运行以构建 docker 容器。 RUN 命令被放在早期,因为它正在获取应用程序依赖项,这在逻辑上应该在流程的早期发生。 (它还将一堆命令链接在一起以保持较低的层数。)但是,ADD 命令预计与 Dockerfile 位于同一位置 - 存储库的根目录。

鉴于此,有没有办法“记住” docker build 从哪里开始,并使用它来定位ADD? (具体来说,在本地开发环境中运行它会在构建时与我的构建服务器有不同的whereami。)还是我坚持交错这些命令,首先复制配置,然后下载依赖项,等等?

当我构建时,我从项目的根目录(包含src 文件夹)执行此操作:

docker build -t myapp:dev .

我得到的错误是:

lstat src/config.json: 没有这样的文件或目录

如果我插入RUN pwd,docker build 会将其报告为/,但我不知道这是否是它认为的“上下文”(也就是说,任何ADD 命令都相对于@ 987654331@).

【问题讨论】:

    标签: docker


    【解决方案1】:

    docker build 命令有一个必需参数,一个上下文路径,用于发送到 docker 引擎以执行构建。此路径通常是单个.,使生成的命令看起来像docker build -t myimage:latest .。所有ADDCOPY 命令都从该上下文中提取文件,在上面的示例中,将使用运行docker build 命令的当前目录。对于运行docker build 命令的服务器和每个用户,他们只需要传递他们在本地计算机上的工作目录。

    要更改ADDCOPY 命令行为,您唯一可以做的另一件事是更改WORKDIR,该WORKDIR 定义了容器内部 命令的相对路径,但不会影响从您使用构建命令发送的上下文中提取文件的位置。

    【讨论】:

    • 我很困惑,然后:ADD 似乎在“上下文”目录中找不到任何东西。 (请参阅问题的更新。)您描述的方式是我所期望的,但是出了点问题。有没有办法验证 docker 将什么视为上下文目录(或当前工作目录)?
    • 是的,请参阅this answer 了解如何打印出当前目录上下文。
    • 原来这是一个评论问题,因为我更清楚地描述了here。我应该包括完整的实际行。感谢您在上下文方面的领导!
    • 这个答案的最后一句话可以突出显示吗?它澄清了 Docker 文档没有说明的内容——WORKDIR 仅影响容器内使用build 发送的上下文。因此,WORKDIR / 不会拉入您计算机的根目录,而是在构建时引用作为您上下文的父目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2010-12-18
    • 2021-12-17
    相关资源
    最近更新 更多