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

