Dockerfile:在 运行 指令中保留符号链接

Dockerfile: Persist symlink in RUN instruction

我正在构建一个 Docker 图像,需要执行符号链接以避免稍后执行 Python 脚本时出错。

我正在 Docker 文件中使用以下命令执行此符号链接:

RUN ln -s /dev/null /dev/raw1394

但是,当稍后使用交互式 shell 输入图像时,此符号链接不存在:

$ docker run -it docker_image /bin/bash root@789442c6ccf6:/# ls /dev/ console core fd full mqueue null ptmx pts random shm stderr stdin stdout tty urandom zero

如果我从容器内部 运行 这个符号链接,它工作正常。

如何使此符号链接在图像的所有层中持久存在?

谢谢

为了使文件(实际上是 inode 的所有内容)持久化,您需要创建一个卷。在这种特殊情况下(/dev 目录)很可能是不可能的,因为 /dev 用于系统文件。

但是您可能知道 Dockerfile 中的 CMD 命令。这是启动映像时执行的命令。您可以指向一个 shell 脚本,该脚本将首先创建您的 link,然后将执行移交给您的代码。此 shell 脚本必须添加到映像中,并且需要设置执行位。

在您的 Dockerfile 中像这样:

ADD start.sh /
CMD /start.sh

在start.sh中:

#!/bin/sh

ln -s /dev/null /dev/raw1394
exec /your/binary_or_whatever