ประกอบด้วยนักเทียบท่า: node_modules ไม่มีอยู่ในวอลุ่มหลังจากการติดตั้ง npm สำเร็จ


184

ฉันมีแอพที่มีบริการดังต่อไปนี้:

  • web/ - เก็บและรันเว็บเซิร์ฟเวอร์ขวดหลาม 3 บนพอร์ต 5000 ใช้ sqlite3
  • worker/- มีindex.jsไฟล์ซึ่งเป็นผู้ปฏิบัติงานสำหรับคิว ปฏิสัมพันธ์เว็บเซิร์ฟเวอร์ที่มีคิวนี้ใช้ API JSON 9730ผ่านพอร์ต ผู้ปฏิบัติงานใช้ Redis สำหรับการจัดเก็บ ผู้ปฏิบัติงานยังเก็บข้อมูลไว้ในโฟลเดอร์ด้วยworker/images/

workerตอนนี้คำถามนี้เฉพาะที่เกี่ยวข้องกับ

worker/Dockerfile

FROM node:0.12

WORKDIR /worker

COPY package.json /worker/
RUN npm install

COPY . /worker/

docker-compose.yml

redis:
    image: redis
worker:
    build: ./worker
    command: npm start
    ports:
        - "9730:9730"
    volumes:
        - worker/:/worker/
    links:
        - redis

เมื่อฉันเรียกใช้docker-compose buildทุกอย่างทำงานตามที่คาดไว้และโมดูล npm ทั้งหมดได้รับการติดตั้ง/worker/node_modulesตามที่ฉันคาดหวัง

npm WARN package.json unfold@1.0.0 No README data

> phantomjs@1.9.2-6 install /worker/node_modules/pageres/node_modules/screenshot-stream/node_modules/phantom-bridge/node_modules/phantomjs
> node install.js

<snip>

แต่เมื่อฉันทำdocker-compose upฉันเห็นข้อผิดพลาดนี้:

worker_1 | Error: Cannot find module 'async'
worker_1 |     at Function.Module._resolveFilename (module.js:336:15)
worker_1 |     at Function.Module._load (module.js:278:25)
worker_1 |     at Module.require (module.js:365:17)
worker_1 |     at require (module.js:384:17)
worker_1 |     at Object.<anonymous> (/worker/index.js:1:75)
worker_1 |     at Module._compile (module.js:460:26)
worker_1 |     at Object.Module._extensions..js (module.js:478:10)
worker_1 |     at Module.load (module.js:355:32)
worker_1 |     at Function.Module._load (module.js:310:12)
worker_1 |     at Function.Module.runMain (module.js:501:10)

ปรากฎว่าไม่มีโมดูลใด ๆ ปรากฏใน/worker/node_modules(บนโฮสต์หรือในคอนเทนเนอร์)

ถ้าในโฮสต์ฉันnpm installแล้วทุกอย่างก็ใช้ได้ดี แต่ฉันไม่ต้องการทำเช่นนั้น ฉันต้องการคอนเทนเนอร์เพื่อจัดการการพึ่งพา

เกิดอะไรขึ้นที่นี่?

(ไม่จำเป็นต้องบอกเลยแพ็คเกจทั้งหมดอยู่ในpackage.json)


คุณพบวิธีแก้ปัญหาหรือไม่?
Justin Stayton

ฉันคิดว่าคุณควรใช้คำสั่ง ONBUILD ... เช่นนี้: github.com/nodejs/docker-node/blob/master/0.12/onbuild/…
Lucas Pottersky

1
คุณจะพัฒนาบนโฮสต์อย่างไรเมื่อ IDE ไม่รู้จักการพึ่งพา node_module
André

2
ลองลบvolumes: - worker/:/worker/block จากdocker-compose.ymlไฟล์ บรรทัดนี้เขียนทับโฟลเดอร์ที่คุณสร้างด้วยคำสั่ง COPY
Stepan

When I run docker-compose build, everything works as expected and all npm modules are installed in /worker/node_modules as I'd expect.- คุณตรวจสอบเรื่องนี้อย่างไร
วาลลิ

คำตอบ:


272

สิ่งนี้เกิดขึ้นเนื่องจากคุณเพิ่มworkerไดเรกทอรีของคุณเป็นไดรฟ์ข้อมูลของคุณdocker-compose.ymlเนื่องจากไม่ได้ต่อเชื่อมวอลุ่มในระหว่างการสร้าง

เมื่อนักเทียบท่าสร้างอิมเมจnode_modulesไดเร็กทอรีจะถูกสร้างขึ้นภายในworkerไดเร็กทอรีและการพึ่งพาทั้งหมดจะถูกติดตั้งที่นั่น จากนั้นในรันไทม์workerไดเรกทอรีจากตัวเชื่อมต่อภายนอกจะถูกเมาท์เข้ากับอินสแตนซ์ของตัวเชื่อมต่อ (ซึ่งไม่มีการติดตั้งnode_modules) ซ่อนตัวnode_modulesคุณที่เพิ่งติดตั้ง docker-compose.ymlคุณสามารถตรวจสอบโดยการเอาไดรฟ์ข้อมูลจาก

วิธีหลีกเลี่ยงปัญหาคือการใช้ไดรฟ์ข้อมูลเพื่อจัดเก็บข้อมูลทั้งหมดnode_modulesเนื่องจากสำเนาปริมาณข้อมูลในข้อมูลจากอิมเมจนักเทียบท่าที่สร้างขึ้นก่อนที่workerจะติดตั้งไดเรกทอรี สิ่งนี้สามารถทำได้docker-compose.ymlดังนี้:

redis:
    image: redis
worker:
    build: ./worker
    command: npm start
    ports:
        - "9730:9730"
    volumes:
        - ./worker/:/worker/
        - /worker/node_modules
    links:
        - redis

ฉันไม่แน่ใจว่าสิ่งนี้จะทำให้เกิดปัญหาใด ๆ สำหรับการพกพาของภาพหรือไม่ แต่ดูเหมือนว่าคุณกำลังใช้นักเทียบท่าเป็นหลักในการจัดเตรียมสภาพแวดล้อมรันไทม์สิ่งนี้ไม่ควรเป็นปัญหา

หากคุณต้องการอ่านเพิ่มเติมเกี่ยวกับปริมาณมีคำแนะนำผู้ใช้ที่ดีที่นี่: https://docs.docker.com/userguide/dockervolumes/

แก้ไข: Docker มีการเปลี่ยนแปลงตั้งแต่มันเป็นไวยากรณ์เพื่อต้องการนำ ./ในการติดตั้งในไฟล์ที่เกี่ยวข้องกับไฟล์ docker-compose.yml


7
คำตอบที่ดีคำอธิบายที่ล่วงล้ำและยอดเยี่ยมน้อยที่สุด!
kkemple

41
ฉันลองใช้วิธีนี้แล้วชนกำแพงเมื่อมีการเปลี่ยนแปลงการอ้างอิง ฉันสร้างภาพขึ้นมาใหม่คอนเทนเนอร์เริ่มใหม่และปริมาตร/worker/node_modulesยังคงเหมือนเดิม (กับการอ้างอิงเก่า) มีเคล็ดลับวิธีการใช้วอลลุ่มใหม่เมื่อสร้างภาพขึ้นใหม่หรือไม่?
Ondrej Slinták

11
ดูเหมือนว่านักเทียบท่าเขียนไม่ได้ลบปริมาณถ้าภาชนะอื่นใช้พวกเขา (แม้ว่าพวกเขาจะตาย) ดังนั้นหากมีคอนเทนเนอร์ที่ตายแล้วชนิดเดียวกัน (ด้วยเหตุผลใดก็ตาม) สถานการณ์ที่ฉันได้อธิบายไว้ในความคิดเห็นก่อนหน้านี้จะตามมา จากสิ่งที่ฉันได้ลองใช้docker-compose rmดูเหมือนจะแก้ไขปัญหานี้ แต่ฉันเชื่อว่าต้องมีวิธีแก้ปัญหาที่ดีกว่าและง่ายกว่า
Ondrej Slinták

15
มีวิธีแก้ปัญหาในปี 2561 โดยไม่จำเป็นต้องrebuild --no-cacheเปลี่ยนทุกครั้งหรือไม่?
Eelke

7
ตอนนี้คุณสามารถใช้`- ใหม่อนันต์ปริมาณ 'ซึ่งจะสร้างปริมาณที่ไม่ระบุชื่อแทนข้อมูลจากภาชนะก่อนหน้า
Mohammed Essehemy

37

node_modulesโฟลเดอร์จะถูกเขียนทับโดยปริมาณและไม่สามารถเข้าถึงได้มากขึ้นในภาชนะที่ ฉันใช้กลยุทธ์การโหลดโมดูลเนทีฟเพื่อดึงโฟลเดอร์ออกจากโวลุ่ม:

/data/node_modules/ # dependencies installed here
/data/app/ # code base

Dockerfile:

COPY package.json /data/
WORKDIR /data/
RUN npm install
ENV PATH /data/node_modules/.bin:$PATH

COPY . /data/app/
WORKDIR /data/app/

node_modulesไดเรกทอรีไม่สามารถเข้าถึงได้จากภายนอกภาชนะเพราะมันจะรวมอยู่ในภาพ


1
มีข้อเสียสำหรับวิธีการนี้หรือไม่? ดูเหมือนว่าจะทำงานได้ดีสำหรับฉัน
Bret Fisher

1
node_modulesไม่สามารถเข้าถึงได้จากด้านนอกของภาชนะบรรจุ แต่ไม่ใช่ข้อเสียจริง ๆ )
jsan

และทุกครั้งที่คุณเปลี่ยน package.json คุณต้องสร้างคอนเทนเนอร์ทั้งหมดด้วย - ไม่แคชใช่มั้ย
ลุค

คุณต้องสร้างอิมเมจใหม่เมื่อคุณเปลี่ยน package.json ใช่ แต่ - ไม่จำเป็นต้องใช้แคช หากคุณรันdocker-compose run app npm installคุณจะสร้าง node_modules ในไดเรกทอรีปัจจุบันและคุณไม่จำเป็นต้องสร้างภาพอีกต่อไป
jsan

9
ข้อเสียคือไม่มีการเติมข้อความอัตโนมัติ IDE อีกต่อไปไม่มีความช่วยเหลือไม่มีประสบการณ์การพัฒนาที่ดี ตอนนี้ทุกสิ่งจำเป็นต้องติดตั้งบนโฮสต์แล้ว แต่ไม่ใช่เหตุผลที่ใช้นักเทียบท่าตรงนี้ที่ dev-host ต้องการอะไรที่ไม่สามารถทำงานกับโครงการได้หรือ
Michael B.

31

โซลูชันที่จัดทำโดย @FrederikNS ทำงานได้ แต่ฉันต้องการตั้งชื่อปริมาตร node_modules ของฉันอย่างชัดเจน

project/docker-compose.ymlไฟล์ของฉัน(นักเขียนที่แต่งเวอร์ชัน 1.6+):

version: '2'
services:
  frontend:
    ....
    build: ./worker
    volumes:
      - ./worker:/worker
      - node_modules:/worker/node_modules
    ....
volumes:
  node_modules:

โครงสร้างไฟล์ของฉันคือ:

project/
   │── worker/
        └─ Dockerfile
   └── docker-compose.yml

มันสร้างวอลลุ่มชื่อproject_node_modulesและนำกลับมาใช้ใหม่ทุกครั้งที่ฉันสมัครใช้งาน

docker volume lsหน้าตาของฉันเป็นแบบนี้:

DRIVER              VOLUME NAME
local               project1_mysql
local               project1_node_modules
local               project2_postgresql
local               project2_node_modules

3
ในขณะที่ "งาน" นี้คุณกำลังหลีกเลี่ยงแนวคิดที่แท้จริงในนักเทียบท่า: การพึ่งพาทั้งหมดจะถูกอบเพื่อความสะดวกในการพกพาสูงสุด คุณไม่สามารถย้ายภาพนี้ได้โดยไม่ต้องใช้คำสั่งอื่นที่น่าจะเป็นไปได้
Javier Buzzi

4
พยายามที่จะแก้ปัญหาเดียวกันเป็นเวลาหลายชั่วโมงและมาด้วยวิธีเดียวกันกับตัวเอง คำตอบของคุณควรได้รับการจัดอันดับสูงสุด แต่ฉันเดาว่า ppl ไม่ได้รับคำตอบเนื่องจากคุณตั้งชื่อโวลุ่มของคุณว่า "node_modules" และผู้อ่านทั้งหมดขาดความจริงที่ว่านี่เป็นการสร้างโวลุ่มใหม่ เมื่ออ่านรหัสของคุณฉันคิดว่าคุณเพียง "ติดตั้งใหม่" โฟลเดอร์ node_modules โลแคลและยกเลิกแนวคิดนั้น บางทีคุณควรแก้ไขชื่อโวลุ่มเป็นชื่อเช่น "container_node_modules" เพื่อให้ชัดเจน :)
เฟเบียน

1
ฉันยังพบว่านี่เป็นโซลูชันที่หรูหราที่สุดซึ่งอนุญาตให้อ้างอิงปริมาณเดียวกันสำหรับโมดูลโหนดในหลายขั้นตอนการสร้างบทความที่ยอดเยี่ยมบทเรียนจากแอพสร้างโหนดใน Dockerยังใช้วิธีการเดียวกัน
kf06925

1
@ kf06925 ผู้ชายที่คุณช่วยชีวิตฉันจริงๆฉันใช้เวลาหลายชั่วโมงในการแก้ปัญหานี้และขอบคุณบทความที่ฉันทำได้ !! ฉันจะซื้อเบียร์ให้คุณถ้าฉันขอบคุณมาก
เฮลาโด

21

ฉันเพิ่งมีปัญหาที่คล้ายกัน คุณสามารถติดตั้งnode_modulesที่อื่นและตั้งค่าNODE_PATHตัวแปรสภาพแวดล้อม

ในตัวอย่างด้านล่างฉันติดตั้งnode_modulesลงใน/install

ผู้ปฏิบัติงาน / Dockerfile

FROM node:0.12

RUN ["mkdir", "/install"]

ADD ["./package.json", "/install"]
WORKDIR /install
RUN npm install --verbose
ENV NODE_PATH=/install/node_modules

WORKDIR /worker

COPY . /worker/

นักเทียบท่า-compose.yml

redis:
    image: redis
worker:
    build: ./worker
    command: npm start
    ports:
        - "9730:9730"
    volumes:
        - worker/:/worker/
    links:
        - redis

6
โซลูชันที่ได้รับการโหวตสูงสุดโดย @FrederikNS นั้นมีประโยชน์คือฉันแก้ไขปัญหาที่แตกต่างกันของการเขียนทับข้อมูลในเครื่องของฉันnode_modulesโดยใช้บทความนี้ได้อย่างไร แต่มันทำให้ฉันพบปัญหานี้ วิธีแก้ปัญหาที่นี่ของการสร้างไดเรกทอรีแยกต่างหากเพื่อคัดลอกของคุณpackage.jsonไปที่npm installนั่นแล้วระบุNODE_PATHตัวแปรสภาพแวดล้อมdocker-compose.ymlเพื่อชี้ไปที่node_modulesโฟลเดอร์ของไดเรกทอรีนั้นทำงานและให้ความรู้สึกถูกต้อง
cwnewhouse

การรวม ENV NODE_PATH = / install / node_modules ใน Dockerfile ในที่สุดก็เป็นทางออกสำหรับฉันหลังจากใช้เวลาหลายชั่วโมงในการลองวิธีการที่แตกต่างกัน ขอบคุณครับ
Benny Meade

ถ้าคุณใช้npm installโฮสต์ มันดูเหมือนจะปรากฏบนโฮสต์และจะมีผลกับภาชนะบรรจุการจัดลำดับความสำคัญมากกว่าnode_modules NODE_PATHดังนั้นคอนเทนเนอร์จะใช้ node_modules จากโฮสต์
เครือข่าย

19

มีทางออกที่สง่างาม:

เพียงเมานต์ไม่ใช่ไดเรกทอรีทั้งหมด แต่มีเพียงไดเรกทอรีแอป วิธีนี้คุณจะไม่มีปัญหาnpm_modulesวิธีนี้คุณจะคุณจะไม่ได้มีปัญหากับ

ตัวอย่าง:

  frontend:
    build:
      context: ./ui_frontend
      dockerfile: Dockerfile.dev
    ports:
    - 3000:3000
    volumes:
    - ./ui_frontend/src:/frontend/src

Dockerfile.dev:

FROM node:7.2.0

#Show colors in docker terminal
ENV COMPOSE_HTTP_TIMEOUT=50000
ENV TERM="xterm-256color"

COPY . /frontend
WORKDIR /frontend
RUN npm install update
RUN npm install --global typescript
RUN npm install --global webpack
RUN npm install --global webpack-dev-server
RUN npm install --global karma protractor
RUN npm install
CMD npm run server:dev

สุกใส ไม่เข้าใจว่าทำไมมันถึงไม่ใช่คำตอบที่ยอมรับ
Jivan

2
นี่เป็นวิธีแก้ปัญหาที่ดีและรวดเร็ว แต่ต้องสร้างใหม่ & พรุนหลังจากการติดตั้งใหม่ขึ้นอยู่กับ
Kunok

ฉันทำมันแตกต่างกันในขณะนี้ควรมีปริมาณโดยเฉพาะสำหรับ node_modules และปริมาณที่คุณติดตั้งจากโฮสต์ จากนั้นก็มีปัญหาใด ๆ
Holms

14

อัปเดต: ใช้โซลูชันที่ให้บริการโดย @FrederikNS

ฉันพบปัญหาเดียวกัน เมื่อมีโฟลเดอร์/workerถูกเมาท์กับคอนเทนเนอร์ - เนื้อหาทั้งหมดจะถูกซิงค์ (ดังนั้นโฟลเดอร์ node_modules จะหายไปหากคุณไม่มีในโฟลเดอร์)

เนื่องจากแพ็กเกจ npm ที่เข้ากันไม่ได้ที่ใช้ระบบปฏิบัติการฉันไม่สามารถติดตั้งโมดูลในเครื่อง - จากนั้นเปิดตัวคอนเทนเนอร์ดังนั้น ..

ทางออกของฉันนี้คือการตัดแหล่งที่มาในsrcโฟลเดอร์แล้วเชื่อมโยงnode_modulesไปยังโฟลเดอร์ที่ใช้ไฟล์ index.js นี้ ดังนั้นindex.jsไฟล์นี้จึงเป็นจุดเริ่มต้นของแอปพลิเคชันของฉัน

เมื่อฉันเรียกใช้คอนเทนเนอร์ฉันเมานต์/app/srcโฟลเดอร์ไปยังsrcโฟลเดอร์ท้องถิ่นของฉัน

ดังนั้นโฟลเดอร์คอนเทนเนอร์จะมีลักษณะดังนี้:

/app
  /node_modules
  /src
    /node_modules -> ../node_modules
    /app.js
  /index.js

มันน่าเกลียดแต่ก็ใช้งานได้ ..


3
โอ้ท่านที่รัก ... ฉันไม่อยากจะเชื่อเลยว่าฉันติดอยู่กับเรื่องนั้นด้วย!
Lucas Pottersky

10

เนื่องจากวิธีการ Node.js โมดูลโหลด , node_modulesสามารถเป็นได้ทุกที่ในเส้นทางไปยังรหัสต้นฉบับของคุณ ตัวอย่างเช่นใส่ที่มาของคุณ/worker/srcและของคุณpackage.jsonใน/workerดังนั้น/worker/node_modulesที่พวกเขากำลังติดตั้ง


7

การติดตั้ง node_modules ในคอนเทนเนอร์ให้แตกต่างจากโฟลเดอร์โปรเจ็กต์และตั้งค่า NODE_PATH เป็นโฟลเดอร์ node_modules ของคุณช่วยฉัน (คุณจำเป็นต้องสร้างคอนเทนเนอร์ใหม่)

ฉันใช้นักแต่งเพลง โครงสร้างไฟล์โครงการของฉัน:

-/myproject
--docker-compose.yml
--nodejs/
----Dockerfile

นักเทียบท่า-compose.yml:

version: '2'
services:
  nodejs:
    image: myproject/nodejs
    build: ./nodejs/.
    volumes:
      - ./nodejs:/workdir
    ports:
      - "23005:3000"
    command: npm run server

Dockerfile ในโฟลเดอร์ nodejs:

FROM node:argon
RUN mkdir /workdir
COPY ./package.json /workdir/.
RUN mkdir /data
RUN ln -s /workdir/package.json /data/.
WORKDIR /data
RUN npm install
ENV NODE_PATH /data/node_modules/
WORKDIR /workdir

1
นี่เป็นทางออกที่ดีที่สุดที่ฉันได้พบ NODE_PATHเป็นกุญแจสำคัญสำหรับฉัน
cdignam

ฉันคิดว่ามันสมเหตุสมผล แต่โดยการตั้งค่า NODE_PATH เมื่อเรียกใช้รูปภาพ CMD npm start ไม่ได้ใช้ NODE_PATH ที่ระบุ
Acton

6

นอกจากนี้ยังมีวิธีแก้ปัญหาง่ายๆโดยไม่ต้องแมปnode_moduleไดเรกทอรีไปยังอีกเล่ม กำลังจะย้ายการติดตั้งแพ็กเกจ npm ไปยังคำสั่ง CMD สุดท้าย

ข้อเสียของวิธีการนี้:

  • เรียกใช้npm installทุกครั้งที่คุณเรียกใช้คอนเทนเนอร์ (สลับจากnpmเป็นyarnอาจเร่งความเร็วกระบวนการนี้สักเล็กน้อย)

ผู้ปฏิบัติงาน / Dockerfile

FROM node:0.12
WORKDIR /worker
COPY package.json /worker/
COPY . /worker/
CMD /bin/bash -c 'npm install; npm start'

นักเทียบท่า-compose.yml

redis:
    image: redis
worker:
    build: ./worker
    ports:
        - "9730:9730"
    volumes:
        - worker/:/worker/
    links:
        - redis

3

มีข้อกำหนดแยกกันสองข้อที่ฉันเห็นสำหรับสภาพแวดล้อมของโหนด dev ... ติดตั้งซอร์สโค้ดของคุณลงในคอนเทนเนอร์และติดตั้ง node_modules จากคอนเทนเนอร์ (สำหรับ IDE ของคุณ) ในการทำสิ่งแรกให้สำเร็จคุณต้องติดตั้งตามปกติ แต่ไม่ใช่ทุกอย่าง ... เพียงแค่สิ่งที่คุณต้องการ

volumes:
    - worker/src:/worker/src
    - worker/package.json:/worker/package.json
    - etc...

เหตุผลที่จะไม่ทำ - /worker/node_modulesก็เพราะนักแต่งเพลงจะยังคงรักษาระดับเสียงระหว่างการวิ่งอยู่ซึ่งหมายความว่าคุณสามารถแยกออกจากสิ่งที่อยู่ในภาพได้จริง ๆ

อันที่สองยากกว่าจริงๆ ทางออกของฉันค่อนข้างแฮ็ค แต่ก็ใช้ได้ ฉันมีสคริปต์เพื่อติดตั้งโฟลเดอร์ node_modules บนเครื่องโฮสต์ของฉันและฉันต้องจำไว้ว่าจะเรียกมันเมื่อใดก็ตามที่ฉันอัปเดต package.json

install_node_modules:
    docker build -t building .
    docker run -v `pwd`/node_modules:/app/node_modules building npm install

2

ในความคิดของฉันเราไม่ควรRUN npm installอยู่ใน Dockerfile แต่เราสามารถเริ่มต้นคอนเทนเนอร์โดยใช้ bash เพื่อติดตั้งการพึ่งพาก่อนเรียกใช้บริการโหนดอย่างเป็นทางการ

docker run -it -v ./app:/usr/src/app  your_node_image_name  /bin/bash
root@247543a930d6:/usr/src/app# npm install

ที่จริงฉันเห็นด้วยกับคุณในนี้ ปริมาณมีขึ้นเพื่อใช้เมื่อคุณต้องการแบ่งปันข้อมูลระหว่างภาชนะและโฮสต์ เมื่อคุณตัดสินใจที่node_modulesจะอยู่ถาวรของคุณแม้หลังจากลบคอนเทนเนอร์แล้วคุณควรทราบด้วยว่าควรทำnpm installด้วยตนเองเมื่อใดหรือเมื่อใด OP แสดงให้เห็นที่จะทำมันในทุกภาพสร้าง คุณสามารถทำได้ แต่คุณไม่จำเป็นต้องใช้วอลลุ่มนั้น ในทุกบิลด์โมดูลจะเป็นข้อมูลล่าสุดเสมอ
phil294

@Blauhirn เป็นประโยชน์ในการเมานต์โฮสต์โลคัลวอลุ่มในคอนเทนเนอร์เมื่อทำเช่น gulp watch (หรือคำสั่งแบบอะนาล็อก) - คุณต้องการให้ node_modules คงอยู่ในขณะที่ยังคงอนุญาตให้เปลี่ยนแปลงแหล่งข้อมูลอื่น (js, css ฯลฯ ) NPM ยืนยันการใช้ gulp ในเครื่องดังนั้นจึงต้องยืนยัน (หรือติดตั้งผ่านวิธีการอื่นในการเริ่มระบบ)
tbm

2

คุณสามารถลองสิ่งนี้ใน Dockerfile ของคุณ:

FROM node:0.12
WORKDIR /worker
CMD bash ./start.sh

จากนั้นคุณควรใช้ระดับเสียงเช่นนี้:

volumes:
  - worker/:/worker:rw

startscript ควรเป็นส่วนหนึ่งของที่เก็บคนทำงานของคุณและมีลักษณะดังนี้:

#!/bin/sh
npm install
npm start

ดังนั้น node_modules จึงเป็นส่วนหนึ่งของไดรฟ์ข้อมูลผู้ปฏิบัติงานของคุณและได้รับการซิงโครไนซ์และสคริปต์ npm จะถูกดำเนินการเมื่อทุกอย่างเสร็จสิ้น


สิ่งนี้จะเพิ่มโอเวอร์เฮดขนาดใหญ่เพื่อเริ่มต้นคอนเทนเนอร์
tbm

2
แต่เฉพาะครั้งแรกเนื่องจาก node_modules จะยังคงอยู่บนเครื่องโลคัล
Parav01d

หรือจนกว่าภาพจะถูกสร้างใหม่หรือลดระดับเสียง :) ที่กล่าวว่าฉันไม่พบทางออกที่ดีกว่าตัวเอง
tbm

0

คุณยังสามารถทิ้ง Dockerfile ของคุณไว้ได้เนื่องจากความเรียบง่ายเพียงใช้อิมเมจพื้นฐานและระบุคำสั่งในไฟล์เขียนของคุณ:

version: '3.2'

services:
  frontend:
    image: node:12-alpine
    volumes:
      - ./frontend/:/app/
    command: sh -c "cd /app/ && yarn && yarn run start"
    expose: [8080]
    ports:
      - 8080:4200

สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับฉันเพราะฉันต้องการสภาพแวดล้อมของภาพ แต่ทำงานกับไฟล์ของฉันนอกคอนเทนเนอร์และฉันคิดว่านี่เป็นสิ่งที่คุณต้องการทำเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.