看来 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 本身会写入此文件。