我正在将构建参数传递给:docker build --build-arg RUNTIME=test
在我的Dockerfile中,我想在CMD中使用参数的值:
CMD ["npm", "run", "start:${RUNTIME}"]
这样做会导致以下错误:npm ERR! missing script: start:${RUNTIME}
-它没有扩展变量
我阅读了这篇文章:Use environment variables in CMD
所以我尝试做:CMD ["sh", "-c", "npm run start:${RUNTIME}"]
-我最终遇到此错误:/bin/sh: [sh,: not found
运行内置容器时,都会发生两种错误。
我正在使用节点高山图像作为基础。任何人都有想法如何获取自变量值以在CMD中扩展?预先感谢!
完整的Dockerfile:
FROM node:10.15.0-alpine as builder
ARG RUNTIME_ENV=test
RUN mkdir -p /usr/app
WORKDIR /usr/app
COPY . .
RUN npm ci
RUN npm run build
FROM node:10.15.0-alpine
COPY --from=builder /usr/app/.npmrc /usr/app/package*.json /usr/app/server.js ./
COPY --from=builder /usr/app/config ./config
COPY --from=builder /usr/app/build ./build
RUN npm ci --only=production
EXPOSE 3000
CMD ["npm", "run", "start:${RUNTIME_ENV}"]
更新: 为了清楚起见,我遇到了两个问题。 1. Samuel P.描述的问题 2.容器之间(多级)不携带ENV值
这是可以使用的Dockerfile,可以在CMD中扩展环境变量:
# Here we set the build-arg as an environment variable.
# Setting this in the base image allows each build stage to access it
FROM node:10.15.0-alpine as base
ARG ENV
ENV RUNTIME_ENV=${ENV}
FROM base as builder
RUN mkdir -p /usr/app
WORKDIR /usr/app
COPY . .
RUN npm ci && npm run build
FROM base
COPY --from=builder /usr/app/.npmrc /usr/app/package*.json /usr/app/server.js ./
COPY --from=builder /usr/app/config ./config
COPY --from=builder /usr/app/build ./build
RUN npm ci --only=production
EXPOSE 3000
CMD npm run start:${RUNTIME_ENV}
答案 0 :(得分:1)
这里的问题是ARG
参数仅在图像构建期间可用。
ARG指令定义了一个变量,用户可以在构建时使用
docker build
标志通过--build-arg <varname>=<value>
命令将其传递给构建器。
https://docs.docker.com/engine/reference/builder/#arg
CMD
在容器启动时执行,其中ARG
变量不再可用。
ENV
变量在构建期间以及在容器中均可用:
从结果映像运行容器时,使用ENV设置的环境变量将保留。
https://docs.docker.com/engine/reference/builder/#env
要解决您的问题,您应该将ARG
变量转移到ENV
变量。
在您的CMD
之前添加以下行:
ENV RUNTIME_ENV ${RUNTIME_ENV}
如果要提供默认值,可以使用以下内容:
ENV RUNTIME_ENV ${RUNTIME_ENV:default_value}
Here是有关docker文档中ARG
和ENV
用法的更多详细信息。