带通配符(*)的Dockerfile符号链接不起作用

时间:2020-06-17 03:22:53

标签: docker docker-compose dockerfile wildcard ln

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

let id = "5ee8468316a2ea32bcfbf411"
let taskName="work"
Data.findByIdAndUpdate(id,
      {$set:{task:{[taskName]:{}}}, 
      (err,data)=> {
      if(err) throw err
  }
)

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

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

我期待以下输出:

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

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

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

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

任何人都知道如何执行此操作,我已经搜索了一段时间,并尝试使用该RUN命令的不同语法,但没有成功。

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

谢谢

1 个答案:

答案 0 :(得分: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表达式直接传递给ln,创建一个名为*的文件,指向一个不存在的*文件。

FROM php:7.3-apache

COPY myfrontend/ /app/frontend/

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