如何选择将锁定文件添加到 docker 容器?

Posted

技术标签:

【中文标题】如何选择将锁定文件添加到 docker 容器?【英文标题】:How can I optionally add a lockfile to a docker container? 【发布时间】:2019-08-12 11:25:21 【问题描述】:

我正在尝试构建一个 docker 镜像,该镜像在构建时可以选择添加一个纱线(或 npm 锁定文件)。我想明确添加它,但如果不包含它,也不会使构建失败。

如果托管应用程序使用确定性构建过程,其目的是尊重它,而不是强制它。我还想让应用程序使用这个容器将自己引导到确定性构建中。

这是我要开始的:

FROM node:8.12.0-alpine
USER node
WORKDIR $my_workdir
COPY --chown=node:node src/yarn.lock ./
COPY --chown=node:node src/package*.json ./
RUN yarn && yarn cache clean
COPY --chown=node:node src/ .
CMD []

如果src/yarn.lock 文件不在文件系统上,我是否可以使用不会失败的命令或选项来代替复制?

【问题讨论】:

我认为这个答案将阐明为什么如果文件不存在,COPY 总是会失败,以及为什么别无选择:***.com/questions/31528384/… 通常最好的做法是将这些锁定文件检查到源代码管理中,因此它应该始终存在。 如果你在复制完整的src/ 目录之后运行 yarn 会发生什么,同时隐式复制(潜在的) yarn.lock?您是否需要使用源存储库中的文件覆盖由 yarn 生成的文件的能力? @ChristophBurschka 通常你复制 package.json 和 yarn.lock 并在复制源代码之前运行 yarn/npm 以利用构建缓存,就好像依赖定义没有改变一样,这一步将使用缓存。 啊,我明白了。独立于源代码缓存纱线构建是有意义的;是的。 【参考方案1】:

您可以尝试将 yarn.lock 添加为 yarn.lock* 以及另一个文件,这样 COPY 就不会失败。沿着这些路线的东西应该可以解决问题:

FROM node:8.12.0-alpine
USER node
WORKDIR $my_workdir
COPY --chown=node:node src/package*.json src/yarn.lock* ./
RUN yarn && yarn cache clean
COPY --chown=node:node src/ .
CMD []

希望对你有帮助!

【讨论】:

以上是关于如何选择将锁定文件添加到 docker 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将docker容器添加到现有docker网络

如何将用户添加到 Docker 容器?

如何将文件添加到 EC2 实例下的容器中?

如何将文件添加到现有的 docker 镜像? [复制]

如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml

如何在我的Mac和Docker容器之间共享文件夹