在GitHub Action的Docker镜像中获取工作目录的方案咨询
解决Docker容器中
process.cwd()路径异常的方案 方案1:Dockerfile指定工作目录+环境变量
在Dockerfile里明确设置工作目录,同时把这个路径注入为环境变量,代码里优先读取环境变量,兼容回退到process.cwd():
修改后的Dockerfile:
FROM node:20-slim # 设定容器内的项目工作目录 WORKDIR /app COPY . . RUN npm install RUN npm run build # 将工作目录设为环境变量,供代码读取 ENV APP_ROOT=/app ENTRYPOINT ["node", "/app/dist/index.js"]
TypeScript代码中:
const ROOT = process.env.APP_ROOT ?? process.cwd();
这样不管容器在什么环境下启动,APP_ROOT都会指向你预设的容器内项目根目录,彻底避免process.cwd()的不确定性。
方案2:通过__dirname推导项目根目录
完全不依赖外部环境,直接从代码文件本身的路径推导根目录,这是最健壮的方式之一:
假设编译后的index.js位于/app/dist目录,那么可以通过路径解析向上回溯到根目录:
import path from 'path'; // 从dist目录向上跳两级,得到项目根目录 const ROOT = path.resolve(__dirname, '../..');
这种方式不受当前工作目录影响,不管是本地运行还是在GitHub Actions的容器里,都能精准定位到项目根。
方案3:调整GitHub Actions容器的工作目录
如果坚持要用process.cwd(),可以在GitHub Actions的工作流配置里指定容器的工作目录,确保容器启动时的当前路径是项目根:
jobs: run-container: runs-on: ubuntu-latest container: image: your-built-image working-directory: /app steps: # 后续执行步骤
不过这种方式依赖CI配置的正确性,一旦配置变更容易出问题,优先级不如前两种。
内容的提问来源于stack exchange,提问作者tompea
相关产品推荐
相关产品推荐

