ডকার-রচনা: নোড_মডিউলগুলি এনপিএম ইনস্টল সফল হওয়ার পরে কোনও ভলিউমে উপস্থিত হয় না


182

নিম্নলিখিত পরিষেবাগুলির সাথে আমার একটি অ্যাপ রয়েছে:

  • web/ - 5000 বন্দরে অজগর 3 ফ্লাস্ক ওয়েব সার্ভারটি ধারণ করে এবং পরিচালনা করে s sqlite3 ব্যবহার করে।
  • worker/- একটি index.jsফাইল রয়েছে যা একটি সারির জন্য কর্মী। ওয়েব সার্ভার পোর্টের উপর একটি জসন এপিআই ব্যবহার করে এই সারিটির সাথে ইন্টারঅ্যাক্ট করে 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, সবকিছু প্রত্যাশিতভাবে কাজ করে এবং সমস্ত এনপিএম মডিউলগুলি /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, তারপরে সবকিছু ঠিকঠাক কাজ করে। তবে আমি তা করতে চাই না। আমি ধারকটি নির্ভরতাগুলি পরিচালনা করতে চাই।

এখানে কি ভুল হচ্ছে?

(বলা বাহুল্য, সমস্ত প্যাকেজ রয়েছে in package.json)


আপনি কি কোনও সমাধান খুঁজে পেয়েছেন?
জাস্টিন স্টেটন

আমার মনে হয় আপনার ONBUILD নির্দেশনা ব্যবহার করা উচিত ... এটির মত: github.com/nodejs/docker-node/blob/master/0.12/onbuild/…
লুকাস পটারস্কি

1
আইডিই নোড_মডিউল নির্ভরতা না জেনে আপনি কীভাবে হোস্টের বিকাশ করবেন?
আন্দ্রে

2
ফাইল volumes: - worker/:/worker/থেকে ব্লক অপসারণ করার চেষ্টা docker-compose.ymlকরুন। এই লাইনটি আপনার ফোল্ডারটি COPY কমান্ড দিয়ে ওভাররাইট করে।
স্টেপান

When I run docker-compose build, everything works as expected and all npm modules are installed in /worker/node_modules as I'd expect.- আপনি এটি কিভাবে পরীক্ষা করেছেন?
ভালি

উত্তর:


271

এটি ঘটেছিল কারণ আপনি নিজের workerডিরেক্টরিটিকে ভলিউম docker-compose.ymlহিসাবে যুক্ত করেছেন, কারণ ভলিউমটি যখন বিল্ডের সময় মাউন্ট হয় না।

ডকার যখন ছবিটি তৈরি করে, node_modulesডিরেক্টরিটি ডিরেক্টরিটি ডিরেক্টরিতে তৈরি করা হয় workerএবং সমস্ত নির্ভরতা সেখানে ইনস্টল করা হয়। তারপরে রানটাইমের workerবাইরে বাইরের ডকার থেকে ডিরেক্টরিটি ডকারের উদাহরণে মাউন্ট করা হয় (যা ইনস্টল করা নেই node_modules) আপনার সদ্য ইনস্টল হওয়াটি লুকিয়ে রাখে node_modules। আপনি নিজের থেকে মাউন্ট করা ভলিউম সরিয়ে এটি যাচাই করতে পারেন docker-compose.yml

ডাইরেক্টরিটি মাউন্ট node_modulesকরার আগে বিল্ট ডকার চিত্র থেকে ডেটা ভলিউমের অনুলিপি হিসাবে সমস্ত সংরক্ষণ করার জন্য একটি ডেটা ভলিউম ব্যবহার করা হয় work 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/dockervolume/

সম্পাদনা: ./ডকার এরপরে ডকার-কমপোজ.আইএমএল ফাইলের সাথে সম্পর্কিত ফাইলগুলিতে মাউন্ট করার জন্য নেতৃস্থানীয় প্রয়োজনের জন্য এর সিনট্যাক্সটি পরিবর্তন করেছে ।


7
দুর্দান্ত উত্তর, অন্তত অনুপ্রবেশকারী এবং দুর্দান্ত ব্যাখ্যা!
21

40
নির্ভরতা পরিবর্তিত হয়ে গেলে আমি এই পদ্ধতিটি ব্যবহার করে প্রাচীরটিতে আঘাত করেছি। আমি চিত্রটি পুনর্নির্মাণ করেছি, নতুন ধারক শুরু করেছি এবং ভলিউম /worker/node_modulesআগের মতোই রয়েছে (পুরানো নির্ভরতার সাথে)। ইমেজটি পুনর্নির্মাণের পরে কীভাবে নতুন ভলিউম ব্যবহার করবেন তা সম্পর্কে কোনও কৌশল আছে?
ওন্দ্রেজ স্লিনটেক

11
মনে হচ্ছে ডকার রচনাগুলি যদি অন্য ধারকগুলি সেগুলি ব্যবহার করে (তারা মরেও যায় তবে) ভলিউমগুলি সরিয়ে দেয় না। সুতরাং যদি একই ধরণের কিছু মৃত পাত্রে থাকে (যাই হোক না কেন কারণেই) আমি পূর্ববর্তী মন্তব্যে বর্ণিত দৃশ্যপটটি অনুসরণ করে। আমি যা চেষ্টা করেছি, docker-compose rmসেগুলি থেকে এই সমস্যার সমাধান হয়েছে বলে মনে হয় তবে আমি বিশ্বাস করি এর থেকে আরও ভাল এবং সহজ সমাধান হতে হবে।
ওন্দ্রেজ স্লিনটেক

14
rebuild --no-cacheপ্রতিবারের ডিপগুলি পরিবর্তন না করেই কি 2018 সালে কোনও সমাধান আছে ?
Eelke

7
আপনি এখন `- পুনরায় নতুন -আনন- ভলিউম use ব্যবহার করতে পারেন যা পূর্ববর্তী পাত্রে থাকা তথ্যের পরিবর্তে বেনামী ভলিউম পুনরায় তৈরি করবে।
মোহাম্মদ এশেমি

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
এই পদ্ধতির কোন ডাউনসাইড আছে? আমার জন্য ভাল কাজ মনে হচ্ছে।
ব্রেট ফিশার

1
node_modulesধারক বাহিরের বাইরে থেকে অ্যাক্সেসযোগ্য না তবে সত্যিকারের নেতিবাচক দিক নয়;)
jsan

এবং প্রতিবারই আপনি প্যাকেজ.জসন পরিবর্তন করেন আপনার সঠিক কন্টেইনারটি - নন-ক্যাশে দিয়ে পুনর্নির্মাণ করা দরকার?
লুক

আপনি প্যাকেজ.জসন পরিবর্তন করার সময় আপনাকে চিত্রটি পুনর্নির্মাণ করতে হবে, হ্যাঁ, তবে - কোনও ক্যাশে প্রয়োজন নেই। আপনি যদি চালনা করেন তবে docker-compose run app npm installআপনি বর্তমান ডিরেক্টরিতে একটি নোড_মডিউল তৈরি করবেন এবং আপনাকে আর চিত্রটি পুনর্নির্মাণের প্রয়োজন হবে না।
jsan

9
ক্ষয়ক্ষতিটি হ'ল: আর আইডিই স্বতঃপূরণ হবে না, কোনও সহায়তা নেই, কোনও ভাল দেব অভিজ্ঞতা নেই। হোস্টে এখন সমস্ত কিছু ইনস্টল করা দরকার, তবে এখানে ডকার ব্যবহার করার কারণটি কি নয় যে কোনও প্রকল্পের সাথে কাজ করতে সক্ষম হওয়ার জন্য দেব-হোস্টের কোনও কিছুর প্রয়োজন নেই?
মাইকেল বি।

31

@ ফ্রেডেরিকএনএস দ্বারা প্রদত্ত সমাধানটি কাজ করে তবে আমি আমার নোড_মডিউলগুলির ভলিউম স্পষ্টভাবে নামকরণ করতে পছন্দ করি।

আমার 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
এই "কাজ" করার সময়, আপনি ডকারে একটি বাস্তব ধারণাটি ছুঁড়ে মারছেন: সমস্ত নির্ভরতা সর্বাধিক বহনযোগ্যতার জন্য বেক করা উচিত। অন্য কমান্ডগুলি চালানো ছাড়া আপনি এই চিত্রটি স্থানান্তর করতে পারবেন না যা জোর করে
জাভিয়ের বুজী

4
কয়েক ঘন্টা ধরে একই সমস্যাটি সমাধান করার চেষ্টা করেছি এবং একই সমাধানটি নিয়ে এসেছি আমার আত্ম। আপনার উত্তরটি সর্বোচ্চ রেট হওয়া উচিত, তবে আমার ধারণা, পিপিএল আপনার উত্তরটি পাবে না কারণ আপনি নিজের ভলিউমটির নাম দিয়েছেন "নোড_মডিউলস" এবং সমস্ত পাঠক এই অনুপস্থিত যে এটি একটি নতুন ভলিউম তৈরি করে। আপনার কোডটি পড়ার সময় আমি ভেবেছিলাম যে আপনি কেবল লোকেল নোড_মডিউলগুলি ফোল্ডারটি "পুনরায় মাউন্ট করুন" এবং সেই ধারণাটি ফেলে দিয়েছেন। এটি পরিষ্কার করার জন্য আপনার ভলিউমের নাম "ধারক_নোড_মডিউলস" এর মতো কিছুতে সম্পাদনা করা উচিত। :)
ফ্যাবিয়ান

1
আমি এটি সবচেয়ে মার্জিত সমাধান হিসাবেও পেয়েছি, যা সহজেই বিভিন্ন বিল্ড পর্যায় জুড়ে নোড মডিউলগুলির জন্য একই ভলিউমের উল্লেখ করতে দেয়। দারকে নোড অ্যাপস বিল্ডিংয়ের দুর্দান্ত নিবন্ধটিও একই পন্থা ব্যবহার করে।
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/

Docker-compose.yml

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

6
@ ফ্রেডেরিকএনএসের শীর্ষে ভোট দেওয়া সমাধানটি দরকারী, আমি কীভাবে এই নিবন্ধটিরnode_modules উপর ভিত্তি করে ধারকটির ওভাররাইট করে আমার স্থানীয় ভলিউমের একটি পৃথক সমস্যা সমাধান করেছি । তবে এটি আমাকে এই সমস্যাটি অনুভব করতে পরিচালিত করেছিল । কপি করার জন্য আপনার আলাদা ডিরেক্টরি তৈরি করার এখানে এই সমাধান করার জন্য চালানো সেখানে, তারপর নির্দিষ্ট পরিবেশ পরিবর্তনশীল দিকে নির্দেশ ডিরেক্টরিটি কাজ ফোল্ডার এবং অধিকার মতানুযায়ী। package.jsonnpm installNODE_PATHdocker-compose.ymlnode_modules
cwnewhouse

ডকফাইফিলে ENV NODE_PATH = / ইনস্টল / নোড_মডিউলগুলি অন্তর্ভুক্ত করা অবশেষে কয়েক ঘন্টা ধরে বিভিন্ন পদ্ধতির চেষ্টা করার পরে আমার জন্য সমাধান হয়েছিল। ধন্যবাদ জনাব.
বেনি মেইড

npm installহোস্টে দৌড়ালে কী হবে ? এটি node_modulesহোস্টে উপস্থিত হবে এবং অগ্রাধিকার গ্রহণের পরে ধারকটিতে প্রতিফলিত হবে বলে মনে হয় NODE_PATH। সুতরাং ধারক হোস্ট থেকে নোড_মডিউল ব্যবহার করবে।
ভিটলেটগুলি

18

মার্জিত সমাধান আছে:

কেবল পুরো ডিরেক্টরি নয়, কেবল অ্যাপ্লিকেশন ডিরেক্টরিটি মাউন্ট করুন। এইভাবে আপনার কোনও সমস্যা হবে না 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

উজ্জ্বল। কেন এটি গৃহীত উত্তর নয় তা বুঝতে পারি না।
জীবন

2
এটি ভাল এবং দ্রুত সমাধান তবে এটির জন্য নতুন নির্ভরতা ইনস্টলেশন পরে পুনর্নির্মাণ ও ছাঁটাই প্রয়োজন।
কুনোক 5'19

আমি এখন এটি অন্যভাবে করি, নোড_মডিউলগুলির জন্য বিশেষভাবে একটি ভলিউম এবং হোস্ট থেকে মাউন্ট করা একটি ভলিউম হওয়া উচিত। তারপরে কোনও অসুবিধা নেই
হোমস

13

আপডেট: @ ফ্রেডেরিকএনএস দ্বারা সরবরাহিত সমাধানটি ব্যবহার করুন ।

আমিও একই সমস্যার মুখোমুখি হয়েছি। যখন ফোল্ডার/worker ধারকটিতে মাউন্ট করা হলে - এর সমস্ত বিষয়বস্তু সিঙ্ক্রোনাইজ হবে (সুতরাং স্থানীয়ভাবে নোড_মডিউলগুলি ফোল্ডারটি অদৃশ্য হয়ে যাবে))

ওএসের ভিত্তিতে অসম্পূর্ণ এনএমপি প্যাকেজগুলির কারণে, আমি কেবল স্থানীয়ভাবে মডিউলগুলি ইনস্টল করতে পারি না - তারপরে ধারকটি চালু করুন, তাই ..

আমার এটির সমাধানটি হ'ল উত্সটি কোনও ফোল্ডারে মুড়ে ফেলা হবেsrc , তারপরে এইnode_modules ফোল্ডারে লিঙ্ক করে এই সূচি.জেএস ফাইলটি ব্যবহার করুন । সুতরাং, index.jsফাইলটি এখন আমার অ্যাপ্লিকেশনটির সূচনা পয়েন্ট।

আমি যখন ধারকটি চালাচ্ছি, তখন আমি /app/srcফোল্ডারটিকে আমার স্থানীয় srcফোল্ডারে রেখেছি ।

সুতরাং ধারক ফোল্ডারটি দেখতে এরকম কিছু দেখাচ্ছে:

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

এটি কুৎসিত , তবে এটি কাজ করে ..


3
ওহ, প্রিয় প্রভু ... আমি বিশ্বাস করতে পারি না আমিও তার সাথে আটকে আছি!
লুকাস পটারস্কি

10

নোড.জেস যেভাবে মডিউল লোড করে , তার কারণে node_modulesআপনার উত্স কোডের পথে যে কোনও জায়গায় থাকতে পারে। উদাহরণস্বরূপ, আপনার উত্সটি /worker/srcএবং আপনার package.jsonভিতরে রাখুন /worker, /worker/node_modulesযেখানে সেগুলি ইনস্টল করা আছে।


7

প্রজেক্ট ফোল্ডার থেকে আলাদা করে পাত্রে নোড_মডিউলগুলি ইনস্টল করা এবং আপনার নোড_মডিউলগুলি ফোল্ডারে NODE_PATH সেট করা আমাকে সহায়তা করে (আপনাকে ধারকটি পুনর্নির্মাণ করতে হবে)।

আমি ডকার-কম্পোজ ব্যবহার করছি। আমার প্রকল্প ফাইল কাঠামো:

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

Docker-compose.yml:

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

নোডেজ ফোল্ডারে ডকফাইফাইল:

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আমার জন্য চাবি ছিল।
সিডিগনাম

আমি মনে করি এটি উপলব্ধি করে তবে NODE_PATH সেট করে, যখন চিত্রটি চালানো হয়, CMD npm start নির্দিষ্ট করা NODE_PATH ব্যবহার করে না।
অ্যাক্টন

6

node_moduleঅন্য ভলিউমে ডিরেক্টরি ম্যাপিং ছাড়াও কিছু সহজ সমাধান রয়েছে । এটি এনএমপি প্যাকেজগুলি চূড়ান্ত সিএমডি কমান্ডে ইনস্টল করতে চলেছে।

এই পদ্ধতির অসুবিধা:

  • চালানোর 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'

Docker-compose.yml

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

3

নোড দেব পরিবেশের জন্য দুটি পৃথক প্রয়োজন দেখতে পাচ্ছি ... আপনার উত্স কোডটি ধারকটির মধ্যে মাউন্ট করুন এবং পাত্রে নোড_মডিউলগুলি মাউন্ট করুন (আপনার আইডিইয়ের জন্য)। প্রথমটি সম্পাদন করার জন্য, আপনি সাধারন মাউন্ট করেন তবে সবকিছু নয় ... কেবল আপনার প্রয়োজনীয় জিনিসগুলি

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

(না করার কারণ) - /worker/node_modules হ'ল ডকার-রচনাটি রানগুলির মধ্যে সেই পরিমাণকে অব্যাহত রাখবে, যার অর্থ আপনি চিত্রটিতে যা আছে তা থেকে সরিয়ে নিতে পারেন (কেবলমাত্র আপনার হোস্ট থেকে বাঁধাই বাঁধা না দেওয়ার উদ্দেশ্যকে পরাস্ত করে))।

দ্বিতীয়টি আসলে শক্ত। আমার সমাধানটি কিছুটা হ্যাকিশ, তবে এটি কার্যকর। আমার হোস্ট মেশিনে নোড_মডিউলগুলি ফোল্ডারটি ইনস্টল করার জন্য আমার কাছে একটি স্ক্রিপ্ট রয়েছে এবং যখনই আমি প্যাকেজ.জসন আপডেট করি তখনই এটি কল করতে হবে (বা, স্থানীয়ভাবে ডকার-কমপোজ বিল্ড চালায় এমন মেক টার্গেটে এটি যুক্ত করুন)।

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

2

আমার মতে, আমাদের RUN npm installডকফাইলে থাকা উচিত নয় । পরিবর্তে, আমরা আনুষ্ঠানিক নোড পরিষেবা চালানোর আগে নির্ভরতা ইনস্টল করতে ব্যাশ ব্যবহার করে একটি ধারক শুরু করতে পারি

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নিজে কখন করবেন বা কখন করবেন না তাও আপনার জানা উচিত । ওপি প্রতিটি ইমেজ বিল্ডে এটি করার পরামর্শ দেয় । আপনি এটি করতে পারেন, তবে আপনার এটির জন্য কোনও ভলিউমও ব্যবহার করার দরকার নেই। প্রতিটি বিল্ডে, মডিউলগুলি যে কোনওভাবেই আপ টু ডেট থাকবে।
ফিলল 294

@ ব্লাউহিরান এটি যেমন স্থানীয় গল্প ওয়াচ (বা অ্যানালগাস কমান্ড) করার সময় কনটেইনারটিতে স্থানীয় হোস্ট ভলিউম মাউন্ট করতে সহায়ক - আপনি নোড_মডিউলগুলি অন্য উত্সগুলিতে (জেএস, সিএসএস ইত্যাদি) পরিবর্তনের অনুমতি বজায় রাখতে চান। এনপিএম স্থানীয় গাল্প ব্যবহারের জন্য জোর দেয়, তাই এটি চালিয়ে যেতে হবে (বা শুরু করার সময় অন্য পদ্ধতিগুলির মাধ্যমে ইনস্টল করা যেতে পারে)
tbm

2

আপনি আপনার ডকফাইলে এ জাতীয় কিছু চেষ্টা করতে পারেন:

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

তারপরে আপনার এই ভলিউমটি ব্যবহার করা উচিত:

volumes:
  - worker/:/worker:rw

প্রারম্ভিকলিপিটি আপনার কর্মী ভান্ডারের একটি অংশ হওয়া উচিত এবং এর মতো দেখতে:

#!/bin/sh
npm install
npm start

সুতরাং নোড_মডিউলগুলি আপনার কর্মী ভলিউমের একটি অংশ এবং সিঙ্ক্রোনাইজ হয়ে যায় এবং সবকিছু শেষ হয়ে গেলে এনপিএম স্ক্রিপ্টগুলি কার্যকর করা হয়।


এটি ধারকটি শুরু করতে একটি বৃহত ওভারহেড যুক্ত করবে।
tbm

2
তবে কেবল প্রথমবারের কারণ স্থানীয় মেশিনে নোড_মডিউলগুলি বজায় থাকবে।
Parav01d

অথবা ছবিটি পুনরায় তৈরি না হওয়া পর্যন্ত, বা ভলিউম অপসারণ করা :)। এটি বলেছিল, আমি নিজে এর থেকে ভাল সমাধান খুঁজে পাইনি।
tbm

0

আপনি নিজের ডকফাইফিলটিকেও খালি করতে পারেন, এর সরলতার কারণে, কেবল একটি প্রাথমিক চিত্র ব্যবহার করুন এবং আপনার রচনা ফাইলটিতে আদেশটি নির্দিষ্ট করুন:

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.