我有用于 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:
?
- 任意字符,不匹配空字符*
- 任意长度的任意字符序列,匹配空字符[abc]
- 要匹配的字符序列,就像 一样?
,但它仅匹配括号中定义的字符所以有3种方法可以解决这个问题
COPY ./migration?/ /app/migrations/
- 还将匹配migrationZ、migration2等等。COPY ./migrations*/ /app/migrations/
- 还将匹配migrations-cool、migrations-oldCOPY ./migration[s]/ /app/migrations/
- 将仅 匹配迁移,因为我们使用 glob 表示匹配 1 项序列中的任何字符[s]
,并且除了字母“s”之外它不能匹配任何字符有关 glob 的更多信息: https://en.wikipedia.org/wiki/Glob_(programming)
归档时间: |
|
查看次数: |
10331 次 |
最近记录: |