gpt4 book ai didi

docker - 在 CMD [Dockerfile] 中扩展 ARG 值

转载 作者:行者123 更新时间:2023-12-02 18:14:24 25 4
gpt4 key购买 nike

我将构建参数传递给: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
当我运行构建的容器时会发生这两个错误。

我使用节点 Alpine 图像作为基础。任何人都知道如何在 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值(多级)

这是我可以在 CMD 中扩展环境变量的工作 Dockerfile:
# 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}

最佳答案

这里的问题是 ARG 参数仅在图像构建期间可用。

The ARG instruction defines a variable that users can pass at build-time to the builder with the docker build command using the --build-arg <varname>=<value> flag.



https://docs.docker.com/engine/reference/builder/#arg
CMD 在容器启动时执行,其中 ARG 变量不再可用。
ENV 变量在构建期间和容器中都可用:

The environment variables set using ENV will persist when a container is run from the resulting image.



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 docs 中有关 ARGENV 用法的更多详细信息。

关于docker - 在 CMD [Dockerfile] 中扩展 ARG 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54836288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com