【问题标题】:Dockerfile build yielding lstat error on ADDDockerfile 构建在 ADD 上产生 lstat 错误
【发布时间】:2017-01-14 04:31:14
【问题描述】:

我有一个非常简单的项目,其结构如下:

docker/
|- src/
|  |- config.json
|
|- Dockerfile

json文件内容:

{
  "setting": "value"
}

Dockerfile的内容:

FROM python:3.5

ADD src/config.json /testapp/config.json  # Config

我运行这个构建命令:

docker build -t testapp:dev .

得到这个结果:

Sending build context to Docker daemon 4.608 kB
Step 1 : FROM python:3.5
 ---> 1d0326469b55
Step 2 : ADD src/config.json /testapp/config.json 
lstat testapp/config.json: no such file or directory

为什么会失败?为什么未找到的项目是testapp/config.json?过去,我曾使用过这种精确构造,例如,将requirements.txt 文件复制到临时工作目录中。我不明白我错过了 ADD 如何工作导致此失败的原因。谁能解释一下?

【问题讨论】:

  • 也许是“或目录”的错?目标目录是否存在?
  • 我可能是错的,但我认为它会创建目录(至少我有另一个工作的 dockerfile 似乎可以做到这一点)。如果我在ADD 之前添加RUN mkdir /testapp && ls -la /testapp,它会失败并显示相同的消息,但会创建并列出testapp 目录。

标签: docker


【解决方案1】:

我成了我的 IDE 的受害者。此行将失败:

ADD src/config.json /testapp/config.json  # Config

但这会成功:

ADD src/config.json /testapp/config.json

读取documentation 进行添加,它似乎正在尝试使用Config 作为目标目录,因此/testapp/config.json 被视为源文件。 IDE 将 # Config 显示为灰色,让我觉得它被视为注释:Dockerfiles do not do inline cmets。

这在comments 上的 Docker 文档中有所介绍:

Docker 将以 # 开头的行视为注释。行中任何其他位置的 # 标记将被视为参数。

【讨论】:

  • 哈!令人惊讶的是,我们所有人在阅读此类内容时自然而然地无视 cmets。我也没有注意到。
  • @NickBurke 是的,我觉得有点昏暗。不过,留下这个问题,以防它帮助别人。
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2014-07-19
  • 2019-01-19
  • 2016-06-14
  • 2022-01-07
  • 2018-11-07
  • 2020-04-15
相关资源
最近更新 更多