Dockerfile中构建一个python+nodejs的镜像。关于环境变量一直掌握不好
我的Dockerfile:
# 使用指定版本的 Node.js 基础镜像
FROM python:3.12.7-slim
# 设置工作目录
WORKDIR /app
RUN apt update && apt install -y curl
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
# 设置环境变量以加载 NVM
ENV NODE_VERSION=20.17.0
# 安装项目依赖
COPY package*.json ./
RUN export NVM_DIR="$HOME/.nvm" && \
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" && \
nvm -v && nvm install $NODE_VERSION && nvm use nvm install $NODE_VERSION && \
node -v && \
npm -v && \
npm config set registry https://registry.npmmirror.com && \
npm install -g node-gyp && \
npm install
# 更新包列表并安装必要工具
RUN apt update && apt install -y make build-essential
# 清理缓存以减小 Docker 镜像大小
RUN apt clean && rm -rf /var/lib/apt/lists/*
# 复制项目文件到容器中
COPY . .
RUN export NVM_DIR="$HOME/.nvm" && \
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" && \
npm run build
# 设置容器启动时的 ENTRYPOINT 脚本
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 9003
# 启动项目
CMD ["npm", "run", "start:prod"]
因为 RUN 命令每一次都是新的层 环境变量无法共享给后面的RUN。就导致我每一条和nvm node相关的命令都需要先导入环境变量 这里还不是问题。最主要在CMD命令也出现了因为环境变量问题 导致npm命令找不到的问题。请教大神帮忙修改这个Dockerfile。
因为在apt无法很好的指定node版本 所以想通过nvm来安装指定版本的node
在网上查教程 说可以通过entrypoint.sh 文件来导入环境变量,但是当我导入后 之前正常的build 流程就会出错。所以我应该如何在docker中安装指定的node版本呢?
在Docker中处理Node.js和Python的依赖时,直接使用官方提供的镜像并避免在构建过程中安装额外的包管理器(如NVM)通常是一个更好的选择。这样可以简化Dockerfile,并减少潜在的问题,如环境变量在层之间不共享的问题。
以下是一个修改后的Dockerfile示例,它直接从官方Node.js镜像和Python镜像中安装所需的版本,并避免了使用NVM:
# 使用multi-stage build来优化最终镜像大小
# 第一阶段:构建Python和Node.js依赖
FROM python:3.12.7-slim AS python-build
FROM node:16.17.0-slim AS node-build
# 设置工作目录
WORKDIR /app
# 复制Python项目文件
COPY requirements.txt /app/
RUN pip install -r requirements.txt
# 复制Node.js项目文件
COPY package*.json /app/
RUN npm install
# 第二阶段:合并Python和Node.js的依赖
FROM python:3.12.7-slim
COPY --from=python-build /app/ /app/
COPY --from=node-build /app/node_modules /app/node_modules
# 设置Node.js可执行文件路径
ENV PATH="/app/node_modules/.bin:$PATH"
# 复制剩余的项目文件
COPY . /app/
# 构建Node.js项目(如果需要)
RUN npm run build
# 设置容器启动时的脚本
COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
# 暴露端口
EXPOSE 9003
# 启动项目
CMD ["npm", "run", "start:prod"]
注意:
node-gyp
),可以在node-build
阶段中安装它们。PATH
环境变量,可以确保Node.js的npm包在全局范围内可用。这种方法的好处是减少了Dockerfile的复杂性,避免了在构建过程中安装额外的包管理器,并且通过多阶段构建优化了最终镜像的大小。
问题内容: 我需要在python脚本中设置一些环境变量,并且我希望从python调用的所有其他脚本(shell脚本)(将是子进程)来查看设置的环境变量。该值为数字。 如果这样做,它会抱怨说1必须是字符串。我也想知道一旦设置它,如何在python(在脚本的后半部分)中读取环境变量。 问题答案: 你可能需要考虑其他方面的代码健壮性; 当你将整数值的变量存储为环境变量时,请尝试 然后为了进行检索,请考虑
问题内容: 我有一个bash脚本,用于设置环境变量并运行命令 现在,我想使用python代替bash,因为我想计算传递给命令的一些参数。 我试过了 和 其次是 但由于未设置LD_LIBRARY_PATH,因此程序总是放弃。 我怎样才能解决这个问题? 感谢帮助! (如果我在调用python脚本之前导出LD_LIBRARY_PATH,则一切正常,但我希望python确定路径并将环境变量设置为正确的值)
问题内容: 使用JetBrains的WebStorm官方Node插件(以及它们的其他IDE)运行Node.js应用程序时,是否可以设置环境变量? 问题答案: 不,从WebStorm不可能,应该在系统中定义环境变量。 更新:在新版本中,可以在“运行/调试”配置中设置环境变量。
问题内容: 我使用martini在Go中有一个GAE应用程序。我需要能够设置环境变量以告诉martini它应该使用生产设置进行初始化。根据Python文档,您可以在app.yaml中设置环境变量。我没有在Go docs中 看到任何有关此的内容,但我猜想它应该可以正常工作。 我需要能够将环境变量设置为,但是我只想在实际投入生产时(即)进行操作。有什么方法可以告诉您仅在非开发服务器上运行吗? 问题答案
问题内容: 我给人的印象是,可以如下将环境变量设置在一行上,以最大程度地减少中间图像。 但是,运行基于此代码段的容器并调用,我看到变量没有单独分配,而是组合为单个字符串。 但是,如果我按如下所示显式设置每个变量,则可以得到预期的输出,并且在调用变量时没有错误。 问题: 是否可以将环境变量的设置合并在一行上?如果是这样,我该怎么办?这是一个好习惯吗? 问题答案: 有两种用于指定环境的格式。如果您需要
我正在尝试在python azure函数中安装jdk pip install-jdk 进口jdk path_to_java_home=jdk。安装('15’,jre=true) 现在,我正在尝试设置JAVA_HOME的路径 我怎么才能做到呢?
谁能建议我如何在运行节点应用程序时在dockerfile中设置NODE_ENV变量。
本文向大家介绍如何在Linux上设置python环境变量PYTHONPATH?,包括了如何在Linux上设置python环境变量PYTHONPATH?的使用技巧和注意事项,需要的朋友参考一下 要将Linux上的PYTHONPATH设置为指向Python以在其他目录中查找模块和包导入,请按如下所示导出PYTHONPATH变量: 在这种情况下,我们将foo目录添加到PYTHONPATH中。请注意,我们