如何在Dockerfile的暂存容器中创建空文件?
显然,touch
不可用:
FROM scratch
RUN ["touch", ".emptyfile"]
结果:
container_linux.go:265: starting container process caused "exec: \"touch\": executable file not found in $PATH"
不幸的是,/dev/null
也不可用:
FROM scratch
COPY /dev/null .emptyfile
结果:
COPY failed: stat /var/lib/docker/tmp/docker-builder872453691/dev/null: no such file or directory
我可以在Docker主机构建上下文中创建一个空文件,然后COPY
它,但是你知道,这太容易了。
有什么想法吗?
答案 0 :(得分:3)
无法运行任何命令。您从头开始的唯一选项是COPY
和ADD
。并且您只能从上下文中复制或添加文件(除非您想从我不推荐的远程URL中ADD
)。因此,您需要在上下文中创建一个空文件并复制它。
然后docker引入了多阶段构建,让你使用另一个构建作为你的上下文。因此,您可以在一个阶段创建一个空文件,然后将其复制到另一个阶段。
FROM busybox AS build-env
RUN touch /empty
FROM scratch
COPY --from=build-env /empty /.emptyfile
答案 1 :(得分:0)
你的第二次尝试没有成功,因为Docker的COPY
命令与cp
的工作方式略有不同。 cp /dev/null
不是按照COPY
在bash中的方式工作,而是从字面上取/dev/null
并实际尝试(并失败)找到名为/dev/null
的本地文件。
你的第一次尝试没有奏效,因为划痕图像是完全绝对空的。暂存容器不包含运行touch
命令的可执行文件,实际上甚至没有任何Unix安装甚至不能识别touch
命令。您不仅无法运行touch
(您似乎已经知道),但您甚至无法在暂存容器中运行任何,除非它是可执行文件你在构建它时自己放入容器。
由于您无法在容器中执行任何操作,因此您可以在容器中添加任何内容的唯一方法是在Dockerfile中使用COPY
或ADD
。