Docker x NodeJS-node_modules问题

时间:2019-03-04 11:32:18

标签: node.js docker docker-compose node-modules

我是一名Web开发人员,目前正在从事next.js项目(这只是SSR ReactJS的框架)。我在该项目上使用Docker配置,添加/删除依赖项时发现了一个问题。添加依赖项时,构建我的项目并使用docker-compose进行构建,新的依赖项不会添加到我的Docker映像中。我必须使用docker system prune清理docker系统以重置所有内容,然后才能构建和启动项目。之后,将我的依赖项添加到我的Docker容器中。

我使用Dockerfile来配置映像,并使用不同的docker-compose文件来根据环境设置不同的配置。这是我的配置:

Dockerfile

FROM node:10.13.0-alpine

# SET environment variables
ENV NODE_VERSION 10.13.0
ENV YARN_VERSION 1.12.3

# Install Yarn
RUN apk add --no-cache --virtual .build-deps-yarn curl \
  && curl -fSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \
  && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \
  && ln -snf /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \
  && ln -snf /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \
  && rm yarn-v$YARN_VERSION.tar.gz \
  && apk del .build-deps-yarn

# Create app directory
RUN mkdir /website
WORKDIR /website
ADD package*.json /website

# Install app dependencies 
RUN yarn install

# Build source files
COPY . /website/
RUN yarn run build

docker-compose.yml(dev env)

version: "3"
services:
  app:
    container_name: website
    build:
      context: .
    ports:
      - "3000:3000"
      - "3332:3332"
      - "9229:9229"
    volumes:
      - /website/node_modules/
      - .:/website
    command: yarn run dev 0.0.0.0 3000
    environment:
      SERVER_URL: https://XXXXXXX.com

以下是用于运行Docker环境的命令:

  

docker-compose build --no-cache

     

docker-compose up

我想我的Docker配置有问题,但是我无法抓住它。您有帮助我的主意吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您当前的卷尚未设置为可以执行的操作。下面的当前设置表示您正在用本地website目录覆盖容器中.目录的内容。

volumes:
  - /website/node_modules/
  - .:/website

我确定您的意图是首先将本地目录映射到容器中,然后使用映像的node_modules目录的原始内容(即node_modules)覆盖/website/node_modules/

按如下所示更改卷的顺序应该可以解决此问题。

volumes:
  - .:/website
  - /website/node_modules/

答案 1 :(得分:0)

您明确告诉Docker您想要这种行为。当你说:

volumes:
  - /website/node_modules/

您正在告诉Docker您不想使用映像中包含的node_modules目录。相反,它应该创建一个匿名卷来保存node_modules目录(该目录在首次使用时具有某些特殊行为),并将数据保留在那里,即使基础图像等其他特性发生了变化。

这意味着,如果您更改package.json并重建映像,则Docker将继续使用node_modules目录的批量版本。 (类似地,.:/website的绑定装载意味着基本上忽略了Dockerfile的后半部分中的所有其他内容。)

我将删除此设置中的volumes:块,以尊重图像中内置的程序。 (我还建议将command:移到CMD中的Dockerfile行。)在不使用Docker的情况下开发和测试您的应用程序,并在其基本运行后构建并部署映像,但之前没有。