簡體   English   中英

如何在使用docker-compose和非root用戶時將node_modules保留在容器中?

[英]How to keep node_modules inside container while using docker-compose and a non-root user?

我正在尋找一種同時實現這些目標的方法:

  • 在容器內使用非root用戶
  • node_modules保留在容器內(以免“污染”主機上的工作目錄)
  • 不使用Dockerfile

我不確定這些目標是否被視為“最佳實踐”。 例如,將node_modules保留在容器內有其缺點

目前我的撰寫文件是這樣的:

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已經安裝

我已經閱讀了關於這個主題的這兩篇文章:

但都達不到我的目標。

更新:

我添加了一行ls -lh /home/node/app/ ,發現node_modulesroot擁有。 這可能是問題所在。

我最終使用了Dockerfile 這是最低限度的。 (我保留一些注釋掉的行,任何人都可能覺得它們很有用。)

我們需要更改容器內node_modules的所有者。 似乎node:9圖像不需要這個。 所以這只適用於node:9-alpine 更新 :對不起。我忘了刪除帶有docker system prune的構建容器。兩個映像都需要這個。這是關於命名卷的權限/所有權的討論。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM