【问题标题】:Dockerfile symbolic link with wildcard (*) not working带有通配符 (*) 的 Dockerfile 符号链接不起作用
【发布时间】:2020-06-17 03:22:53
【问题描述】:

我是 docker 新手,使用以下 RUN 命令创建符号链接时遇到问题:

FROM php:7.3-apache

RUN ["/bin/bash", "-c", "ln -s /app/frontend/web/* /var/www/html"] && \
    ln -s /app/backend/web /var/www/html/admin

这是在容器内执行“ls -la /var/www/html”时的输出:

'*' -> '/app/frontend/web/*'
admin -> /app/backend/web

我期待以下输出:

css -> /app/frontend/web/css
index.php -> /app/frontend/web/index.php
admin -> /app/backend/web

直接在容器中创建符号链接时,我得到了正确的输出,但由于某种原因,通配符 (*) 在构建映像时不起作用。

如果我用特定文件替换通配符,则符号链接会在构建时正确创建。 这是可行的,但我想避免列出文件夹中的每个文件:

FROM php:7.3-apache

RUN ["/bin/bash", "-c", "ln -s /app/frontend/web/index.php /var/www/html"]

任何人都知道如何做到这一点,我已经搜索了一段时间并尝试了该 RUN 命令的不同语法但没有成功。

编辑:到我的后端的符号链接按预期工作。我还应该注意到我正在使用 docker-compose 并且包含我的 webapp 的卷已安装到 /app 文件夹。

谢谢

【问题讨论】:

  • 你试过直接运行命令吗?运行 ln -s /app/frontend/web/index/.php /var/www/html
  • @camba1 是的,它不再起作用了

标签: docker docker-compose dockerfile wildcard ln


【解决方案1】:

当* 不匹配任何文件时,它会按原样传递给您的命令:

$ ls -l
total 0
-rw-r--r-- 1 leodag leodag 0 jun 17 03:29 a
-rw-r--r-- 1 leodag leodag 0 jun 17 03:29 b
-rw-r--r-- 1 leodag leodag 0 jun 17 03:29 c

$ ls d*
ls: cannot access 'd*': No such file or directory

所以你的问题是/app/frontend/web/ 里面什么都没有,因为你还没有复制文件——你正试图在FROM 之后运行它。首先,您需要复制文件,以便 glob 与您的文件匹配。否则,glob 表达式按字面意思传递给ln,创建一个名为* 的文件,指向一个不存在的* 文件。

FROM php:7.3-apache

COPY myfrontend/ /app/frontend/

RUN ["/bin/bash", "-c", "ln -s /app/frontend/web/* /var/www/html"]

【讨论】:

  • 我认为你是对的。我尝试在容器中创建一个指向空文件夹的符号链接,它的行为完全相同。我忘了提到我有一个 docker-compose 将卷安装到 /app 文件夹,所以它不应该是空的。尝试创建符号链接时,该卷似乎尚未安装。奇怪的是,在那个创建另一个符号链接到我的后端的命令之后我有另一个 RUN 命令(为简单起见,我缩短了我的 dockerfile)并且它运行良好。这使我指向了通配符。我将编辑我的初始帖子以添加该信息。
  • 卷挂载发生在您运行容器时,解析 Dockerfile 以创建映像。在创建映像期间,临时容器中不会存在到您定义的源的卷挂载。
  • 卷不会在构建时挂载 - 它们在运行时专用。你的构建过程可能不依赖于在 Docker 没有注意到事情不是最新的情况下会发生变化的事情,比如卷。只要文件名和路径没有需要通过 bash 扩展的全局变量,就可以创建指向不存在文件的符号链接。
  • 您可以将您的应用程序与 Dockerfile 放在同一个文件夹中,这样您就可以使用 COPY 将其放入容器中,或者单独创建每个链接。
  • 谢谢!这就说得通了。我对后端的符号链接有效这一事实感到困惑。
猜你喜欢
  • 1970-01-01
  • 2013-10-24
  • 2016-09-15
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多