如何在Dockerfile的CMD指令中使用--build-arg传入的PORT变量?
问题原因
- 你使用的是exec形式的CMD(数组语法),该模式下Docker不会启动shell进程,不会解析
${PORT}这类环境变量占位符,你写的echo ${PORT}会被直接作为普通字符串传给next命令,自然无法识别为端口号。 ARG是构建时变量,仅在镜像构建阶段生效,镜像构建完成后的容器运行阶段默认无法读取ARG的值,需要将ARG赋值给ENV才能在容器运行时保留该变量。
正确实现方式
修改Dockerfile如下:
FROM node:16.6.1-alpine3.14 RUN apk add dumb-init ARG PORT # 将构建时ARG赋值给运行时ENV,保证容器启动时可以读取到变量 ENV PORT=${PORT} EXPOSE $PORT ENTRYPOINT ["/usr/bin/dumb-init", "--"] # 显式调用sh解析环境变量,exec用于替换sh进程保证信号正常传递 CMD ["sh", "-c", "exec npx next start -p ${PORT}"]
按照这个写法构建镜像时传入--build-arg PORT=3100即可正常指定端口,后续如果需要临时修改端口也可以在运行容器时通过-e PORT=xxx直接覆盖,无需重新构建镜像。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

