在CMD中扩展ARG值[Dockerfile]

时间:2019-02-22 22:51:41

标签: docker dockerfile

我正在将构建参数传递给: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}

1 个答案:

答案 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文档中ARGENV用法的更多详细信息。