Dockerfile:复制文件夹(如果存在)(有条件复制)

Myk*_*lov 7 docker dockerfile

我有用于 NodeJS 应用程序的 Dockerfile,需要复制容器内的迁移、种子文件夹。但问题是我们所有的应用程序都使用相同的 Dockerfile,但并非所有应用程序都与 DB 一起使用并具有迁移、种子

Dockerfile:

...
# * package json, to be able run `npm run ...`
COPY ./package.json /app/
# * migrations, seeds if they exist
COPY ./migrations/ /app/migrations/
COPY ./seeds/ /app/seeds/
...
Run Code Online (Sandbox Code Playgroud)

一切正常,但如果我们没有迁移文件夹,我们将得到:

 => CACHED [app 4/9] COPY --from=builder /app/node_modules /app/node_modules                                                                                                                                                                                              0.0s
 => CACHED [app 5/9] COPY --from=builder /app/dist /app/dist                                                                                                                                                                                                              0.0s
 => CACHED [app 6/9] COPY ./package.json /app/                                                                                                                                                                                                                            0.0s
 => ERROR [app 7/9] COPY ./migrations/ /app/migrations/                                                                                                                                                                                                                   0.0s
------
 > [app 7/9] COPY ./migrations/ /app/migrations/:
------
failed to compute cache key: "/migrations" not found: not found
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?

Myk*_*lov 20

TL;博士;

COPY ./migration[s]/ /app/migrations/
Run Code Online (Sandbox Code Playgroud)

更详细的答案

我们可以使用 glob 模式来实现这样的行为,如果 Docker 找不到任何有效的源,它也不会失败,有 3 个最常用的 glob:

  1. ?- 任意字符,不匹配空字符
  2. *- 任意长度的任意字符序列,匹配空字符
  3. [abc]- 要匹配的字符序列,就像 一样?,但它仅匹配括号中定义的字符

所以有3种方法可以解决这个问题

  1. COPY ./migration?/ /app/migrations/- 还将匹配migrationZmigration2等等。
  2. COPY ./migrations*/ /app/migrations/- 还将匹配migrations-coolmigrations-old
  3. COPY ./migration[s]/ /app/migrations/- 将仅 匹配迁移,因为我们使用 glob 表示匹配 1 项序列中的任何字符[s],并且除了字母“s”之外它不能匹配任何字符

有关 glob 的更多信息: https://en.wikipedia.org/wiki/Glob_(programming)

  • 由于某种原因,我收到错误: Step 3/12 : COPY ./migration?/ /app/migrations/ COPY failed: no source files were specified Docker version 20.10.7, build f0df350 (3认同)