2016-04-13 68 views
3

我在我的Dockerfile中有以下命令序列;通過SED注意更換到位Dockerfile COPY需要一個陳舊的文件副本?

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/ 

這將運行差不多好了,那就是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/ 

會有人解釋這種奇怪的行爲?

回答

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

+0

或者在一個'RUN'中執行sed和cp,並在它們之間使用';'(並且它避免了幾次RUN,如Dockerfile最佳實踐中所述)https://docs.docker.com/engine/ userguide/CHI-圖像/ dockerfile_best實踐/ – user2915097