为什么Docker构建时无法将文件COPY到/dev文件夹?

8

我想创建一个 Docker 镜像,在其中将文件添加到 /dev 文件夹。我正在使用以下 Dockerfile

FROM ubuntu:bionic
COPY test.txt /dev/

在使用以下工具构建后:

docker build -t test .

我得到了一个Docker镜像,在/dev文件夹中没有添加任何内容。 docker build 没有抛出错误,这让我感到非常奇怪,因为复制到其他文件夹工作正常。例如:
  • COPY test.txt /
  • COPY test.txt /root/
  • COPY test.txt /home/
都可以正常工作。 /dev文件夹是否具有特殊权限?如何将文件复制到/dev文件夹中?
我在Windows上使用的是Docker Toolbox

你为什么想要使用/dev文件夹?它是一个特殊的文件夹,包含对所有设备的引用。 - k0pernikus
请参见:https://www.tldp.org/LDP/sag/html/dev-fs.html - k0pernikus
相关:https://askubuntu.com/questions/165219/what-exactly-are-items-in-the-dev-directory - k0pernikus
@k0pernikus 我想添加一个驱动程序。更多信息请参见 https://github.com/EAIBOT/ydlidar - Floris Devreese
2个回答

11

/dev是Linux系统上专用的文件夹,用于维护与设备相关的资源(文件系统、磁盘等),并挂载在特殊的文件系统上。在Docker容器中,它将被重新挂载到一个专用的tmpfs文件系统上,并不在主容器文件系统(/)上。请参考以下示例:

$ docker run -it --rm ubuntu:18.04
root@17b9ad96ccbc:/# df -h /dev/
Filesystem      Size  Used Avail Use% Mounted on
tmpfs            64M     0   64M   0% /dev

在你的情况下,你的文件实际上是在构建过程中被复制到了一个临时文件系统中,但是这个文件系统在构建完成后就消失了。

结论:不要将/dev作为目标文件夹,选择其他文件夹。


谢谢@Zeitounator。现在我明白为什么文件消失了,而没有抛出任何错误。 - Floris Devreese

0

我认为在创建容器时会挂载/dev,所以如果你真的需要它,你可以在此之后将文件复制(或符号链接)到其中,例如在entrypoint.sh脚本中:

#!/bin/bash
set -e

ln -s /app/my_virtual_device /dev/my_virtual_device

exec "$@"

然后在 Dockerfile 中引用它:

FROM ...

...

ENRTYPOINT ["bash", "entrypoint.sh"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接