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

时间:2018-04-05 21:43:34

标签: 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"
}

所以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"]

3 个答案:

答案 0 :(得分:2)

如果您只需要节点应用内部的版本.. 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

docker build& amp;运行:

{ 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: '/' }

答案 1 :(得分:0)

尝试在RUN命令中使用bash脚本(即grep)来读取值并设置为环境变量。 Docker将使用变量集创建一个快照,然后你可以使用它。

答案 2 :(得分:-1)

你有没有试过像:

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

RUN export VERSION=$(npm run version)

ENV NODE_ENV production
CMD ["node", "server.js"]