Dockerfile COPY采用该文件的陈旧副本?

时间:2016-04-13 06:10:37

标签: docker dockerfile

我的Dockerfile中有以下命令序列;请注意 sed 替换到位

RUN sed -i "s/replace this/with that/g" ./dir/file.yaml
COPY ./dir/file.yaml /usr/src/app/node_modules/serve-swagger-editor/node_modules/swagger-editor/spec-files/

运行ALMOST好,即file.yaml被复制到目标位置,但是:

  • ./dir/file.yaml包含 sed
  • 所做的更改
  • /usr/src/.../spec-files/file.yaml没有。

事实证明,此解决方法修复了COPY问题:

RUN sed -i "s/replace this/with that/g" ./dir/file.yaml
RUN cp ./dir/file.yaml /usr/src/app/node_modules/serve-swagger-editor/node_modules/swagger-editor/spec-files/

有人会解释这种奇怪的行为吗?

1 个答案:

答案 0 :(得分:2)

RUN在容器中执行命令,因此sed将应用于其中的文件./dir/file.yaml。你可能在WORKDIR/dir/file.yamlWORKDIR)中有一个/同一个文件,这解释了为什么第二个选项有效。

第一个版本中的COPY将使用主机构建目录中的/usr/src/app/node_modules/serve-swagger-editor/node_modules/swagger-editor/spec-files/覆盖./dir/file.yaml文件。这个命令之前没有受到sed命令的影响,因为它在容器之外。

所以你可以在容器中首先COPY文件,然后使用你的RUN命令来修改它。或者在运行docker build之前修改它。