我如何让 docker build 覆盖文件?

我如何让 docker build 覆盖文件?

看来 docker build 不会覆盖之前复制的文件。我有一个包含多条复制指令的 dockerfile,较早的 COPY 指令中涉及的文件不会被较晚的指令覆盖。

一个简化的例子(尽管如果第一个副本是恰好包含相关文件的整个目录,也会发生这种情况):

COPY docker/config/file1.yml $BASE/config/thatfile.yml
COPY docker/config/file2.yml $BASE/config/thatfile.yml

构建此文件后,$BASE/config/thatfile.yml 包含 file1.yml 的内容。有没有办法让它包含 file2.yml 的内容?

我的主要用例是复制整个文件夹的配置文件,然后替换特定构建的选定配置文件。

答案1

我也遇到过这种情况,但经过多次测试后发现,我的一个COPY指令的目标路径有一个拼写错误。

仔细检查这些文件的真实去向

-COPY nginx.conf /etc/ngnix/nginx.conf
+COPY nginx.conf /etc/nginx/nginx.conf

答案2

我无法理解你的问题。你肯定是输入错误,使用了不同的版本,或者你有一个将某些东西挂载到某些东西上的 docker-compose 卷?

https://github.com/bor8/lolquadrat

git clone https://github.com/bor8/lolquadrat
cd lolquadrat/
docker build --no-cache .

最后输出:

步骤 1/6:来自 busybox:latest
 ---> 19485c79a9bb
步骤 2/6:ARG BASE=/opt/hihi
 ---> 正在 e4a01850931e 中运行
移除中间容器 e4a01850931e
 ---> 193009cc4df9
步骤 3/6:复制 docker/config/file1.yml $BASE/config/thatfile.yml
 ---> bea7783ade65
步骤 4/6:运行 echo 'first thatfile:' && cat ${BASE}/config/thatfile.yml
 ---> 201e86de06bc 正在运行
第一个文件:
文件1内容
移除中间容器 201e86de06bc
 ---> ca7676a83a16
步骤 5/6:复制 docker/config/file2.yml $BASE/config/thatfile.yml
 ---> da5985cd90fb
步骤 6/6:运行 echo 'second thatfile:' && cat ${BASE}/config/thatfile.yml
 ---> 正在运行 f70153917070
第二个文件:
文件2内容
拆除中间容器 f70153917070
 ---> 5a4b17a1e77e
成功构建5a4b17a1e77e

可以清楚的看到,在第二次COPY命令之后,该文件thatfile.yml具有第二个文件()的内容。file2content

正在运行的容器file2content也会显示。要测试这一点,您可以CMD tail -f /dev/null在 Dockerfile 的最后一行创建一个,然后使用进入docker exec -it <CONTAINER_ID_VIA_DOCKER_PS> /bin/sh。并使用显示内容cat thatfile.yml

我还没有完全测试文件夹(而不是file1.yml)是否存在相同的行为。

答案3

也许您已经安装了卷?

COPY local_file.txt /directory-in-container/

/directory-in-container如果是已安装的卷,则上述操作不起作用。

答案4

与您的情况无关,但因为这是该问题在谷歌上的第一个搜索结果,所以添加。就我而言,我尝试:COPY resolv.conf /etc/resolv.conf,但失败了,因为显然 Docker 本身会写入此文件。

相关内容