【发布时间】:2021-06-08 05:56:29
【问题描述】:
当我构建我的 docker 镜像并运行容器时,双引号会从我的环境变量中删除。
这是我的 Dockerfile:
FROM node:15
WORKDIR /usr/src/app
RUN mkdir -p /usr/src/app/logs
COPY package*.json ./
RUN npm install
COPY . .
# Timezone
ENV TZ America/Chicago
### Edges
ENV MONITORING_EDGE_THRESHOLDS={"onlineStatus":"OFFLINE","processors":{"critical":90,"degraded":75},"memory":{"critical":90,"degraded":75},"disks":{"critical":90,"degraded":75},"subsystems":{"critical":200,"degraded":100},"networks":{"critical":2,"degraded":1}}
CMD [ "node", "server.js" ]
Docker 检查显示引号被删除:
MONITORING_EDGE_THRESHOLDS
{onlineStatus:OFFLINE,processors:{critical:90,degraded:75},memory:{critical:90,degraded:75},disks:{critical:90,degraded:75},subsystems:{critical:200,degraded:100},networks:{critical:2,degraded:1}}
随后,我的 node.js 应用程序失败了,因为我需要使用 JSON.parse() 将此值转换为 JSON 对象,但由于 Docker 删除了引号,它不是有效的 JSON 对象,因此无法正常工作。
【问题讨论】:
-
大概是因为环境变量可以被引用,但是你必须转义里面的任何引号,所以
MONITORING_EDGE_THRESHOLDS="{\"onlineStatus\":\"OFFLINE\",\"........"但是为什么这是一个环境变量而不是像monitoring-prod.config.json这样你刚刚读入的文件? -
没有“JSON 对象”这样的东西。它要么是 JSON,即 text,要么是一个对象。解析 JSON 会创建一个对象。尝试不要在其上调用
JSON.parse(),而是直接访问属性。 -
@Chris G,返回未定义。它是一个字符串,直到它被转换为带有
JSON.parse(string)的对象,当使用 .env 在 localhost 上运行时,它可以正常工作。 -
@Mike'Pomax'Kamermans,使用单引号不会转义吗?
-
docs 说:
The value will be interpreted for other environment variables, so quote characters will be removed if they are not escaped.我猜只是将原始 JSON 中的所有"替换为\"并将其用作值,不需要外部分隔符。
标签: javascript node.js docker