You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux正常运行的Django+React Docker Compose在Windows10报错求助

跨平台Docker Compose迁移Node报错问题

我在Linux(Kubuntu)笔记本上用Docker Compose搭建了一套环境,包含运行Django的Python容器,前端采用React框架。将Docker配置迁移到Windows10台式机后,出现如下错误:
/node_modules/.bin/../node/bin/node: 1: This: not found

已尝试的排查步骤

  • 检查两台设备容器内的Node和npm版本,均为v22.4.0和10.8.1,版本无差异;
  • 在另一台Windows笔记本部署相同环境,仍出现相同错误,推测为Linux-Windows跨平台问题;
  • 查找了相关StackOverflow及GitHub问题,但均不适用于Docker场景;尝试了GitHub issue中的解决方案,但我Windows系统使用nvm,无对应可删除的文件夹;切换Node版本后错误依旧;且Docker容器内的Node是从源码直接安装,不应受本地Node环境影响。

环境配置详情

以下为受影响容器的Dockerfile和compose.yaml内容:

Python容器Dockerfile

# syntax=docker/dockerfile:1

ARG PYTHON_VERSION=3.12.2
FROM python:${PYTHON_VERSION} AS base

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y sudo gcc default-libmysqlclient-dev pkg-config \
    && rm -rf /var/lib/apt/lists/*

# Prevents Python from writing pyc files.
ENV PYTHONDONTWRITEBYTECODE=1

# Keeps Python from buffering stdout and stderr to avoid situations where
# the application crashes without emitting any logs due to buffering.
ENV PYTHONUNBUFFERED=1

# Create a non-privileged user that the app will run under.
ARG UID=10001
RUN useradd -m --uid "${UID}" appuser
RUN echo 'appuser:askStackOverflow' | chpasswd
RUN usermod -aG sudo appuser

# Create a sudoers configuration file in /etc/sudoers.d/
RUN echo 'appuser localhost=(root) NOPASSWD: /usr/bin/npm' > /etc/sudoers.d/myuser \
    && chmod 440 /etc/sudoers.d/myuser \
    && chown root:root /etc/sudoers.d/myuser


RUN cd /home/appuser/
WORKDIR /home/appuser/

# Copy the source code into the container.
COPY . /home/appuser/

# Download dependencies as a separate step to take advantage of Docker's caching.
RUN --mount=type=cache,target=/root/.cache/pip \
    --mount=type=bind,source=requirements.txt,target=requirements.txt \
    pip install --root-user-action=ignore --upgrade pip \
    && pip install --root-user-action=ignore mysqlclient \
    && pip install --root-user-action=ignore -r requirements.txt


RUN curl -fsSL https://deb.nodesource.com/setup_22.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt-get -y install nodejs

# Switch to the non-privileged user to run the application.
# USER appuser

WORKDIR /home/appuser/Frontend/
RUN sudo /usr/bin/npm install

VOLUME /home/appuser/Frontend/src/
VOLUME /home/appuser/MemeCataloger2/
VOLUME /home/appuser/api/
VOLUME /home/appuser/Sockets/

WORKDIR /home/appuser/

# Expose the port that the application listens on.
EXPOSE 8000

# Make migrations to the database
RUN python manage.py makemigrations

# Run the application.
CMD ["bash", "-c", "python manage.py migrate & python manage.py runserver 0.0.0.0:8000 & cd /home/appuser/Frontend/ && npm run dev"]

compose.yaml

services:
  db:
    build:
      context: ./MySqlDockerSetup
    restart: always
    user: root
    secrets:
      - db-password
      - django-db-password
    volumes:
      - db-data:/var/lib/mysql
    # environment:
      # MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db-password
      # MYSQL_USER: django
      # MYSQL_PASSWORD_FILE: /run/secrets/django-db-password
    healthcheck:
        test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
        interval: 10s
        timeout: 10s
        retries: 3
    expose:
      - 3306:3306

  redis:
    image: redis:7
    ports:
     - 6379:6379

  server:
    build:
      context: .
    volumes:
        - ./Frontend/src:/home/appuser/Frontend/src:rshared
        - ./MemeCataloger2:/home/appuser/MemeCataloger2:rshared
        - ./api:/home/appuser/api:rshared
        - ./Sockets:/home/appuser/Sockets:rshared

    ports:
      - 8000:8000
    depends_on:
        db:
            condition: service_healthy

volumes:
    db-data:
    server-frontend-src:
    server-memecataloger2:
    server-api:
    server-sockets:

secrets:
  db-password:
    file: ./MySqlDockerSetup/db-password.txt
  django-db-password:
    file: ./MySqlDockerSetup/django-db-password.txt

解决思路及排查方向

  1. 统一文件换行符:Windows默认CRLF换行,Linux用LF。本地Windows的前端文件挂载到Linux容器后,可能导致npm脚本执行错误。可在Windows上将项目文件换行符改为LF,或在Dockerfile中添加dos2unix命令处理node_modules内的脚本及挂载文件。
  2. 规避宿主机文件干扰:确认容器内安装的node_modules未被宿主机文件覆盖,可将Frontend/node_modules加入.dockerignore,确保容器依赖独立;同时检查bind mount的权限设置,避免Windows文件系统权限影响容器内操作。
  3. 修正Node执行路径:报错中的相对路径解析可能存在问题,可尝试在npm run dev前指定绝对路径,如设置NODE_PATH=/usr/bin/node,或修改前端package.json脚本,直接调用/usr/bin/node而非依赖npm路径解析。
  4. 调整Docker挂载配置:Windows上rshared挂载选项兼容性较差,可尝试去掉该选项改用普通bind mount;或切换Docker Desktop后端为WSL2,WSL2文件系统更接近Linux,能减少跨平台兼容性问题。
  5. 拆分前后端容器:当前将Django与React放在同一容器内增加了复杂度,可拆分出独立的前端容器,使用node:22镜像构建运行,符合Docker最佳实践的同时,避免混合环境带来的跨平台问题。
  6. 手动验证容器内环境:进入运行中的容器(docker exec -it <容器ID> bash),直接执行/usr/bin/node -v确认Node可正常运行,再手动执行cd /home/appuser/Frontend && npm run dev,查看具体错误输出,定位问题脚本。

内容的提问来源于stack exchange,提问作者cdyswnnr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:19:52