如何获取 Dockerfile 中 package.json 的版本值?

use*_*695 8 node.js docker dockerfile

这就是我的Dockerfile的样子:首先复制文件,然后运行npm installnpm build. 正如您所看到的,我确实设置了高效的 ENV 变量。

我想将当前 package.json 文件的版本获取到正在运行的 docker 映像。所以我想到使用 en ENV 变量,例如VERSION

我的 package.json 文件可能如下所示:

"version": "0.0.1"
"scripts": {
     "version": "echo $npm_package_version"
}
Run Code Online (Sandbox Code Playgroud)

所以npm run version返回版本值。但我不知道如何在我的 dockerfile 中使用这个结果作为 ENV

COPY . /app
RUN npm install --silent
RUN npm run build

RUN VERSION=$(npm run version)

ENV NODE_ENV production
ENV VERSION ???
CMD ["node", "server.js"]
Run Code Online (Sandbox Code Playgroud)

Ste*_*hen 3

如果您只需要节点应用程序内部的版本..require('./package.json').version就可以了。

否则,既然您已经在构建自己的容器,为什么不让自己变得更轻松并安装 jq 呢?然后就可以运行了VERSION=$(jq .version package.json -r)

但无论哪种方式,您都不能简单地从 RUN 命令导出变量以在另一个阶段使用。不过,有一个常见的解决方法:

FROM node:8-alpine
RUN apk update && apk add jq
COPY package.json .
COPY server.js .
RUN jq .version package.json -r > /root/version.txt
CMD VERSION=$(cat /root/version.txt) node server.js
Run Code Online (Sandbox Code Playgroud)

docker 构建和运行的结果:

{ NODE_VERSION: '8.11.1',
  YARN_VERSION: '1.5.1',
  HOSTNAME: 'xxxxx',
  SHLVL: '1',
  HOME: '/root',
  VERSION: '1.0.0',
  PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
  PWD: '/' }
Run Code Online (Sandbox Code Playgroud)