从其他目录将文件复制到Dockerfile

时间:2020-03-24 11:59:28

标签: docker kubernetes

Dockerfile是否可以从主机文件系统而不是从其构建上下文中复制某些文件?

# Inside Dockerfile
FROM gradle:latest
COPY ~/.super/secrets.yaml /opt

# I think you can work around it with but doesn't look nice
COPY ../../../../../../.super/secrets.yaml /opt

何时在/home/user/some/path/to/project/路径上运行命令?

docker build .

3 个答案:

答案 0 :(得分:0)

将“外部”文件放入Docker容器的通常方法是在启动docker构建之前将它们复制到构建目录中。强烈建议为此创建一个脚本,以确保您的准备步骤可重复。

答案 1 :(得分:0)

否,这不可能进入目录。这就是为什么。

在运行docker build .时,您是否曾经考虑过 dot 到底代表什么?好吧,这是docker documentation

的一部分

docker build命令从Dockerfile和 “上下文”。构建的上下文是位于以下位置的文件集 指定的PATH或URL。构建过程可以引用任何文件 在上下文中。例如,您的构建可以使用COPY指令来 在上下文中引用文件。

如您所见,该 dot 引用了 context 路径(此处表示“此目录”)。上下文路径下的所有文件都会发送到docker守护程序,您只能在Dockerfile中引用这些文件。当然,您可以认为自己很聪明并且引用了/(根路径),因此可以访问计算机上的所有文件。 (我强烈建议您尝试一下,看看会发生什么)。您应该看到发生的是Docker客户端冻结。或者,真的吗?好吧,它并没有真正冻结,它会将所有/目录发送到docker daemon,并且可能需要很长时间,或者(可能是)您的内存不足。

现在,当您了解此限制时,您会发现使它起作用的唯一方法是将您感兴趣的文件复制到上下文路径的位置,然后运行docker build命令。

答案 2 :(得分:0)

执行docker build .时,最后一个参数是构建上下文目录:您只能从中访问文件。

您可以执行docker build ../../../,但是该根目录中的每个文件都将被打包并发送到Docker守护程序,这会很慢。

因此,请执行以下操作:

cp ../../../secret.yaml .
docker build .
rm secret.yaml

但是,请记住,这将导致秘密永远嵌入到映像中,这可能会带来安全风险。如果这是运行时所需的秘密,则最好在运行时通过环境变量将其传递。如果您只需要构建映像的秘密,则还有其他选择,例如https://pythonspeed.com/articles/docker-build-secrets/