node.js – 如何在使用docker-compose和非root用户时将node_modules保留在容器中?

前端之家收集整理的这篇文章主要介绍了node.js – 如何在使用docker-compose和非root用户时将node_modules保留在容器中?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在寻找一种同时实现这些目标的方法

>在容器内使用非root用户
>将node_modules保留在容器内(不要“污染”主机上的工作目录)
>不使用Dockerfile

我不确定这些目标是否被视为“最佳实践”.例如,将容器内的node_modules保留为disadvantages.

目前我的撰写文件是这样的:

services:
  # ...

  node:
    image: "node:9"
    user: "node"
    working_dir: /home/node/app
    environment:
      # - NODE_ENV=production
      - NPM_CONFIG_PREFIX=/home/node/.npm-global
      - PATH=$PATH:/home/node/.npm-global/bin
    volumes:
      - ./proj/:/home/node/app
      - /home/node/app/node_modules # mark1
    ports:
      - "3001:3001"
    command: >
      bash -c "echo hello
      && ls -lh /home/node/app/ 
      && npm install
      && npm i -g babel-cli
      && npm i -g flow-bin
      && npm start"
    depends_on:
      - redis

但是有

"Error: EACCES: permission denied,access
'/home/node/app/node_modules'".

如果我注释掉#mark1行,则容器会运行,但node_modules将被写入主机(因为./proj是mounted)

我已经阅读了关于这个主题的这两篇文章

> https://blog.getjaco.com/jaco-labs-nodejs-docker-missing-manual/
> http://jdlm.info/articles/2016/03/06/lessons-building-node-app-docker.html

但都达不到我的目标.

更新:

添加了一行ls -lh / home / node / app /,发现node_modules由root拥有.这可能是问题所在.

最佳答案
我最终使用了Dockerfile.这是最低限度的. (我保留一些注释掉的行,任何人都可能觉得它们很有用.)

我们需要更改容器内node_modules的所有者.似乎节点:9图像不需要这个.所以这只适用于节点:9-alpine. (更新:对不起.我忘了删除带有docker system prune的内置容器.两个图像都需要这个.这里是a discussion on permissions/ownership of named volumes`)

FROM node:9-alpine

#ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
#ENV PATH=$PATH:/home/node/.npm-global/bin

RUN mkdir -p /home/node/app/node_modules
RUN chown -R node:node /home/node/app

#USER node

#WORKDIR /home/node/app

#RUN npm install --silent --progress=false ; \
#    npm i -g babel-cli --silent --progress=false ;\
#    npm i -g flow-bin --silent --progress=false

docker-compose.yml最终如下:

services:
  # ...
  node:
    # image: "node:9-alpine"
    build: ./proj
    user: "node"
    working_dir: /home/node/app
    environment:
      # - NODE_ENV=production
      - NPM_CONFIG_PREFIX=/home/node/.npm-global
      - PATH=$PATH:/home/node/.npm-global/bin
    volumes:
      - ./proj/:/home/node/app
      - /home/node/app/node_modules/
    ports:
      - "3006:3001"
    command: >
      /bin/sh -c "echo hello
      && ls -lh /home/node/app/
      && npm install
      && npm i -g babel-cli
      && npm i -g flow-bin
      && npm start"
    depends_on:
      - redis
原文链接:https://www.f2er.com/docker/436654.html

猜你在找的Docker相关文章