Docker x NodeJS - Issue with node_modules



我是当前正在从事next.js项目的Web开发人员(这只是SSR Reactjs的框架)。我正在此项目上使用Docker Config,并且在添加/删除依赖项时发现了一个问题。当我添加依赖关系时,构建我的项目并使用Docker-Compose进行加密时,我的新依赖性并未添加到我的Docker映像中。我必须使用docker system prune清洁我的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

我想我的码头配置中有什么问题,但我无法抓住它。你有帮助我的想法吗?

谢谢!

现在,您的卷未设置为您打算做的事情。下面的当前集合意味着您使用本地.目录在容器中覆盖website目录的内容。

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

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

更改卷的顺序如下,应解决问题。

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

您明确地告诉Docker您想要此行为。当您说:

volumes:
  - /website/node_modules/

您正在告诉Docker,您不想使用烤入图像中的node_modules目录。相反,它应该创建一个匿名卷来保存node_modules目录(在其首次使用时具有某些特殊行为),并将数据持续存在,即使其他特征(例如基础图像更改)也是如此。

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

我将删除此设置中的volumes:块,以尊重图像中构建的程序。(我还建议将command:移至Dockerfile中的CMD行。)开发和测试您的应用程序而不使用Docker,并在基本上工作后构建和部署并部署并部署。

最新更新