ডকার: এক্সিকিউটেবল ফাইলটি AT PATH- তে পাওয়া যায় নি


216

আমার একটি ডকার ইমেজ রয়েছে যা ইনস্টল হয় gruntতবে আমি যখন এটি চালানোর চেষ্টা করি তখন আমার একটি ত্রুটি ঘটে:

Error response from daemon: Cannot start container foo_1: \
    exec: "grunt serve": executable file not found in $PATH

আমি যদি ইন্টারঅ্যাকটিভ মোডে ব্যাশ চালাই তবে gruntতা উপলব্ধ।

আমি কি ভুল করছি?

এখানে আমার ডকফায়াইল:

# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs

MAINTAINER My Name, me@email.com

ENV HOME /home/web
WORKDIR /home/web/site

RUN useradd web -d /home/web -s /bin/bash -m

RUN npm install -g grunt-cli
RUN npm install -g bower

RUN chown -R web:web /home/web
USER web

RUN git clone https://github.com/repo/site /home/web/site

RUN npm install
RUN bower install --config.interactive=false --allow-root

ENV NODE_ENV development

# Port 9000 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]

আপনি ব্যবহার করে ডকার তৈরির চেষ্টা করতে পারেন CMD grunt? অথবা আপনি পুরো পথটি পেরিয়ে গ্রুন্ড কমান্ড কার্যকর করার চেষ্টা করতে পারেন?
mgaido

@ mark91 দয়া তোমার উপর সম্প্রসারিত পারে কি ব্যবহার করছেন বিল্ড বলছি CMD grunt?না আপনি কি বলতে চান ড্রপ ["এবং "]?
স্টিভ লরিমার

কেবল এটি চেষ্টা করে দেখুন - এবং এটি কাজ করেছে - ধন্যবাদ! সুতরাং অন্য যে কেউ আসছেন, তার জন্য পরিবর্তন CMD ["grunt"]করুনCMD grunt
স্টিভ লরিমার

10
কারণ আপনি যদি CMD ["grunt"]কমান্ডটি প্রয়োগ করতে অন্য শেল ব্যবহার করেন, তবে সেই শেলটিতে $ PATH সেট না হওয়ার সম্ভাবনা রয়েছে।
mgaido

উত্তর:


198

আপনি যখন কমান্ডের জন্য CMD ["grunt"]এক্সিকিউট ফর্ম্যাটটি ব্যবহার করেন (উদাহরণস্বরূপ , ডাবল উদ্ধৃতি সহ একটি JSON অ্যারে) এটি শেল ছাড়াই কার্যকর করা হবে । এর অর্থ হল বেশিরভাগ পরিবেশের ভেরিয়েবল উপস্থিত থাকবে না।

আপনি যদি আপনার কমান্ডকে একটি নিয়মিত স্ট্রিং (উদাহরণস্বরূপ CMD grunt) হিসাবে নির্দিষ্ট করেন তবে তারপরে স্ট্রিংটি CMDকার্যকর হবে /bin/sh -c

ডকফাইফাইল রেফারেন্সের সিএমডি বিভাগে এটি সম্পর্কে আরও তথ্য উপলব্ধ ।



এই বোবা প্রশ্নটি ক্ষমা করুন, তবে আপনি শেল ছাড়াই কীভাবে একটি লিনাক্স কমান্ড চালাবেন? লিনাক্স মেশিনে (ডকার ব্যবহার না করে) এটি করার সমতুল্য কী হবে?
উইসবাকী

1
আমার নিজের প্রশ্নের উত্তর দিতে, এটি করা sudo setবা করার মতো (exec set)। এগুলি ব্যর্থ হবে কারণ তারা শেল ছাড়াই কমান্ডগুলি কার্যকর করে (এবং setএটি শেল বিল্টিন)। তবে, sudo lsএবং (exec ls)এটি কাজ করবে কারণ lsএকটি আসল বাইনারি ফাইল /bin/ls
উইসবুকি

315

আমি যখন আমার ত্রুটি বার্তাটি পেস্ট করেছি তখন গুগলে এটিই প্রথম ফলাফল এবং এটি কারণ আমার যুক্তিগুলি কার্যকর ছিল না।

সমস্ত যুক্তির পরে ধারকটির নাম থাকতে হবে ।

খারাপ:

docker run <container_name> -v $(pwd):/src -it

ভাল:

docker run -v $(pwd):/src -it <container_name>

132
আপনি কোডিং শুরুর আগে যদি আপনি সর্বদা ডকুমেন্টেশনগুলি ভালভাবে পড়ে থাকেন তবে আপনি কখনই কিছু করতে পারবেন না। আপনি যখন নিজের নতুন গাড়িটি কিনেছিলেন, আপনি বাড়িটি চালানোর আগে 200 পৃষ্ঠার ম্যানুয়ালটি পড়েছেন? না And এবং যখন আপনার গাড়িতে কোনও সমস্যা ছিল, আপনি কি প্রথমে এটি গুগল করেছিলেন, না আপনি ম্যানুয়ালটি পেয়েছেন? এটি পুরোপুরি যুক্তিসঙ্গত, আমি কেবল সেই সমস্ত লোককেই কল্পনা করতে পারি যারা এটি দরকারী বলে মনে করেছেন তবে আপটোট বোতামটি ক্লিক করেননি! কী ধরনের অযৌক্তিক তা হ'ল এই সম্পূর্ণরূপে সম্পর্কযুক্ত উত্তরটি হ'ল এই ত্রুটি বার্তার জন্য প্রথম গুগল ফলাফল, বা ডকার ক্লিপটি অনিচ্ছুক এবং ক্ষমতাহীন। চিয়ার্স।
স্যারিংক করুন

8
অনেক স্ক্রিপ্টে পতাকাগুলির ক্রমটি গুরুত্বপূর্ণ নয়, তাই কারও সাথে এটি কেন ঘটতে পারে তা আমি দেখতে পাচ্ছি। উত্তরটি বেশ সহায়ক। বলার অপেক্ষা রাখে না যে ডকারের ত্রুটি বার্তাটি মোটেই কার্যকর নয়।
মারিওস

9
বাহ, আমি এই উত্তরটির জন্য না পারলে কিছু সময়ের জন্য সংগ্রাম করব। ইউনিক্সের ইতিমধ্যে একটি মানক, নমনীয় এবং শক্তিশালী
সি এল এল

1
এটা আমার জন্য সমস্যা ছিল। ধারকটির নামটি শেষের দিকে রেখে কাজ করা দেখে মনে হয়েছিল
রব সেগাল

3
আমি গৃহীত উত্তর দ্বারা বিভ্রান্ত হয়েছিল, আমার নিজের লিখতে চেয়েছিলেন, তবে মনে হচ্ছে এটি ইতিমধ্যে এখানে রয়েছে। সুতরাং আমি নিশ্চিত করতে পারি যে এটি সমস্যার সমাধান করে ...
আর্টুরাস এম

24

আমি একই সমস্যা খুঁজে পেয়েছি। আমি নিম্নলিখিতগুলি করেছেন:

docker run -ti devops -v /tmp:/tmp /bin/bash

আমি যখন এটি পরিবর্তন

docker run -ti -v /tmp:/tmp devops /bin/bash

এটা ঠিক কাজ করে।


1
এটি আমার পক্ষে কাজ করেছে, কিন্তু আমি -vএখানে ব্যবহার বুঝতে পারি না । -vআমার জন্য একটি ভলিউম (যেমন বর্ণিত হয়েছে docker run --help | grep "\-v") বাঁধার জন্য, আমি ইতিমধ্যে (ডকার সেটিংস) /tmpমাউন্ট করেছি File Sharing, তবে কেন আমি আবার এটি ব্যবহার করব?
আহমাদ

12

এর মতো ত্রুটির জন্য বেশ কয়েকটি সম্ভাব্য কারণ রয়েছে।

আমার ক্ষেত্রে, এটা এক্সিকিউটেবল ফাইল হবার কথা ছিলো ( docker-entrypoint.shথেকে গোস্ট Dockerfile ব্লগ ) এক্সিকিউটেবল ফাইল মোড উদাসীন পর আমি ডাউনলোড চাই।

সমাধান: chmod +x docker-entrypoint.sh


এটি এমন মন্তব্য যা আমাকে সঠিক উত্তরের দিকে নির্দেশ করেছে। আমাকে ফাইলটি কপি করতে হয়েছিল এবং তারপরে এটি chmod করতে হয়েছিল।
30:38

7

একটি ডকারের ধারকটি শেল ছাড়াই নির্মিত হতে পারে (যেমন https://github.com/fluent/fluent-bit-docker-image/issues/19 )।

এই ক্ষেত্রে, আপনি একটি স্ট্যাটিকালি সংকলিত শেল অনুলিপি করতে পারেন এবং এটি কার্যকর করতে পারেন, যেমন

docker create --name temp-busybox busybox:1.31.0
docker cp temp-busybox:/bin/busybox busybox
docker cp busybox mycontainerid:/busybox
docker exec -it mycontainerid /bin/busybox sh

4

কিছু কারণে, আমি "বাশ" স্পষ্টকারী যুক্ত না করা পর্যন্ত আমি ত্রুটিটি পেয়েছি। এমনকি আমার এন্ট্রিপয়েন্ট ফাইলের শীর্ষে "#! / Bin / bash" যুক্ত করা কোনও উপকারে আসেনি।

ENTRYPOINT [ "bash", "entrypoint.sh" ]

@ স্টিভলরিমার, হ্যাঁ আমি এন্ট্রিপয়েন্ট কল করার আগে একটি COPYএবং তারপর করেছি RUN chmod +x /compile_nibbler.sh
beyond

1

আমার একই সমস্যা ছিল, প্রচুর গুগল করার পরেও কীভাবে এটি ঠিক করা যায় তা আমি খুঁজে পেলাম না।

হঠাৎ আমি আমার বোকা ভুল লক্ষ্য করলাম :)

ডক্সে উল্লিখিত হিসাবে , এর শেষ অংশটি docker runহ'ল কমান্ডারটি চালনার পরে আপনি যে আদেশটি চালাতে চান তা এবং তার যুক্তি।

কনটেইনার নাম নয় !!!

এটা আমার বিব্রতকর ভুল ছিল।

আমি কী ভুল করেছি তা দেখার জন্য নীচে আমি আমার কমান্ড লাইনের ছবি দিয়েছি।

এবং ডক্সে উল্লিখিত এই ফিক্সটি

এখানে চিত্র বর্ণনা লিখুন


-7

এটিকে কাজ করতে / ইউএসআর / বিনের সাথে নরম রেফারেন্স যুক্ত করতে:

ln -s $ (যা নোড) / ইউএসআর / বিন / নোড

ln -s $ (যা এনপিএম) / ইউএসআর / বিন / এনপিএম


1
এটি কীভাবে তাকে সহায়তা করবে সে সম্পর্কে বিবরণ যুক্ত করুন।
ম্যাথিউস সানি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.