如何在临时容器中创建一个空文件?

时间:2018-01-05 22:47:17

标签: docker dockerfile

如何在Dockerfile的暂存容器中创建空文件?

尝试1

显然,touch不可用:

FROM scratch
RUN ["touch", ".emptyfile"]

结果:

container_linux.go:265: starting container process caused "exec: \"touch\": executable file not found in $PATH"

尝试2

不幸的是,/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它,但是你知道,这太容易了。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

无法运行任何命令。您从头开始的唯一选项是COPYADD。并且您只能从上下文中复制或添加文件(除非您想从我不推荐的远程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中使用COPYADD