ডক এন্ট্রিপয়েন্ট চলমান বাশ স্ক্রিপ্টটি "অনুমতি অস্বীকার" পেয়েছে


122

আমি আমার নোড.জেএস অ্যাপ্লিকেশনটিকে ডকারাইজ করার চেষ্টা করছি। কনটেইনারটি তৈরি হয়ে গেলে আমি এটি চালাতে চাই git cloneএবং নোড সার্ভারটি শুরু করি। অতএব আমি এই অপারেশনগুলিকে একটি .sh স্ক্রিপ্টে রেখেছি। এবং স্ক্রিপ্টটি ENTRYPOINT- তে একক কমান্ড হিসাবে চালান:

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git

#install gcc 4.9
RUN apt-get install -y software-properties-common python-software-properties
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update
RUN apt-get install -y libstdc++-4.9-dev

#install newst nodejs
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ADD package.json /usr/src/app/
RUN npm install

ADD docker-entrypoint.sh /usr/src/app/

EXPOSE 8080

ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"] 

আমার ডকার-এন্ট্রিপয়েন্ট.শ দেখতে দেখতে এই রকম:

git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git

/usr/bin/node server.js

এই চিত্রটি তৈরির পরে চালান:

docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>

আমি পাচ্ছি:

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

আমি ধারকটিতে শেল দিয়েছি এবং ডকার-এন্ট্রি পয়েন্টের অনুমতি হ'ল:

-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh

তিনটি প্রশ্ন:

  1. আমার বাশ স্ক্রিপ্টের ভুল বাক্য গঠন আছে?

  2. কোনও ছবিতে এটি যুক্ত করার আগে আমি কীভাবে বাশ ফাইলের অনুমতি পরিবর্তন করব?

  3. ব্যাশ স্ক্রিপ্টটি ব্যবহার না করে এন্ট্রিপয়েন্টে একাধিক গিট কমান্ড চালানোর সর্বোত্তম উপায় কী?

ধন্যবাদ।


এই প্রশ্নের উত্তর দিতে সক্ষম হতে আমাদের ফাইল অনুমতিগুলি দেখতে হবে।
চার্লস ডাফি

BTW, যদি এটা একটা হয় ব্যাশ স্ক্রিপ্ট, না একটি SH স্ক্রিপ্ট, একটি .shএক্সটেনশনটি একটি বিভ্রান্তিকর ছাপ যা সম্পর্কে দোভাষী এটা নির্বাহ করতে পারেন ছেড়ে। আপনি এটি গ্রহণের বিষয়ে বিবেচনা করতে পারেন - ইউনিক্স কমান্ডগুলির এক্সটেনশনগুলি রাখার জন্য এটি প্রচলিত নয় ( ls.elfউদাহরণস্বরূপ আপনি চালনা করেন না )।
চার্লস ডাফি

আমরা কি execসেভাবে খোল পারি ? এটি bashউপসর্গ প্রয়োজন হবে না ?
জিন-ফ্রান্সোইস ফ্যাব্রে

@ জিন-ফ্রান্সোইসফ্যাব্রে, আপনার প্রশ্নটি দিয়ে আপনি ঠিক কী বোঝাতে চাইছেন? (আমি বুঝতে পারি না "সেইভাবে একটি শেল কার্যকর করা" এর অর্থ কী - এই প্রসঙ্গে "সেই পথে" কী?)
চার্লস ডাফি

2
নির্বোধ প্রশ্ন, যাইহোক - স্ক্রিপ্টের চিত্রগুলি এগুলি যুক্ত করার আগে আপনি কি অনুমতিগুলি সঠিক ?
চার্লস ডাফি

উত্তর:


183
  1. "অনুমতি প্রত্যাখ্যান করা" আপনার স্ক্রিপ্টকে একেবারে ডাকা হতে বাধা দেয় । সুতরাং, শুধুমাত্র সিনট্যাক্স যে সম্ভবত প্রাসঙ্গিক হতে পারে প্রথম লাইন ( "কুঁড়েঘর"), যা মত হওয়া উচিত যে হয় #!/usr/bin/env bash, অথবা #!/bin/bashবা অনুরূপ আপনার টার্গেট এর ফাইল সিস্টেম বিন্যাস উপর নির্ভর করে।

  2. সম্ভবত সম্ভবত ফাইল সিস্টেমের অনুমতিগুলি কার্যকর করার অনুমতি দেওয়ার জন্য সেট করা হচ্ছে না। এটিও সম্ভব যে শেবাং এমন কিছু উল্লেখ করেছে যা কার্যকরযোগ্য নয়, তবে এটি সম্ভবত খুব কম।

  3. পূর্ববর্তী সমস্যাগুলি মেরামত করার স্বাচ্ছন্দ্যে তৈরি।


এর সহজ পাঠ

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

... স্ক্রিপ্টটি কার্যকর কার্যকর হিসাবে চিহ্নিত করা হয় নি।

RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]

ধারক মধ্যে এটি ঠিকানা হবে। পর্যায়ক্রমে, আপনি তা নিশ্চিত করতে পারেন যে ডকফাইফিলের দ্বারা বর্ণিত স্থানীয় অনুলিপি কার্যকরযোগ্য , এবং তারপরে ব্যবহার করুন COPY(যা মেটাডেটা ধরে রাখতে স্পষ্টতই নথিভুক্ত করা হয়েছে)।


আমি আপনি ঠিক মনে করেন. পরিবর্তে আমার কপি ব্যবহার করা উচিত। তবে মনে হচ্ছে বাশ স্ক্রিপ্টটি কপি করার পরে আমার এখনও অনুমতি পরিবর্তন করতে হবে।
ক্যালভিন হু

আমার একটি ফার ফাইল রয়েছে যা একটি কমান্ডের উপর ভিত্তি করে .bash স্ক্রিপ্ট তৈরি করে এবং সেগুলি শেষ হয়ে গেলে সেগুলি সরিয়ে দেয়। সুতরাং এক্সিকিউট করার অনুমতি সেট করার জন্য ভাগ করা খণ্ডগুলির প্রয়োজনীয়তা হ'ল আমি এখনও লড়াই করছি।
রাপি

@ রাউপি, আপনি যদি noexecপতাকা সহ মাউন্ট পয়েন্টের বাইরে স্ক্রিপ্ট চালাতে চান তবে bash yourscriptতার পরিবর্তে চালান ./yourscript
চার্লস ডাফি 15

1
আমি docker buildঅন্তর্নিহিত করি না, যখন আমি মধ্যবর্তী ধারকটি চালিত করি তখন ভাল কাজ করে। তবে আমি যখন করি তখন docker runএটি ত্রুটি ছুঁড়ে দেয়। আমি পেয়েছি এমন একটি জাদুকরী মধ্যবর্তী ধারক মনে হচ্ছে like
টাইনা

46

একটি এক্সিকিউটেবল ফাইলের এক্সিকিউট করার আগে আপনি এটি কার্যকর করতে পারেন তার জন্য নির্ধারিত অনুমতিগুলির প্রয়োজন।

আপনার মেশিনে আপনি যেখানে ডকারের চিত্র তৈরি করছেন (ডকারের চিত্রের ভিতরে নেই) চালানোর চেষ্টা করুন:

ls -la path/to/directory

আপনার এক্সিকিউটেবলের জন্য আউটপুট প্রথম কলামে (এক্ষেত্রে ডকার-এন্ট্রিপয়েন্ট.শ) এক্সিকিউটেবল বিটগুলি এমন কিছু সেট করা উচিত:

-rwxrwxr-x

যদি না হয় তবে চেষ্টা করুন:

chmod +x docker-entrypoint.sh

এবং তারপরে আবার আপনার ডকার চিত্রটি তৈরি করুন।

ডকার এটির নিজস্ব ফাইল সিস্টেম ব্যবহার করে তবে এটি উত্স ডিরেক্টরিগুলি থেকে সমস্ত কিছু (অনুমতি বিট সহ) অনুলিপি করে।


13
chmod +x docker-entrypoint.shটিজে হোস্টটি আসলে প্রস্তাবিত সমাধান, কারণ এটি আপনার পরিবর্তনের চেয়ে অনেক সহজ Dockerfile
জোট্রোকেন

16

আমি একই সমস্যার মুখোমুখি হয়েছি এবং এটি সমাধান করেছে

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]

মূল প্রশ্নে ডকফাইফিলের জন্য এটি হওয়া উচিত:

ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]

5
এটি একটি কার্যনির্বাহী, তবে দুর্দান্ত নয় - এটি স্ক্রিপ্টটির ব্যাখ্যা দিয়ে shশেবাং এর দোভাষীর স্পেসিফিকেশন উপেক্ষা করে; সুতরাং যদি এটি ব্যবহার করে #!/bin/bashবলে, এটি ব্যাশের সাথে ব্যাখ্যা করতে চায় তবে এটিকে উপেক্ষা করা হবে এবং এর shপরিবর্তে এটি ব্যাখ্যা করা হবে, এভাবে ভাষার বৈশিষ্ট্যগুলি যেমন [[ ]]অ্যারে ইত্যাদি অস্বীকার করে
চার্লস ডাফি

আমি আপনার পদ্ধতির ব্যবহার করেছি এবং এটি কার্যকর হয়েছে। সম্ভবত ডস 2 ইউনিক্সও কৌতুকটি করে
ওয়াকান টঙ্কা

1

আপনি যদি ডকারফিল ব্যবহার না করেন তবে আপনি কেবল বাশের কমান্ড লাইন আর্গুমেন্ট হিসাবে অনুমতি যুক্ত করতে পারেন:

docker run -t <image>  /bin/bash -c "chmod +x /usr/src/app/docker-entrypoint.sh; /usr/src/app/docker-entrypoint.sh"

1

এটি আমার উত্তরের দু'বছর আগে জিজ্ঞাসা করা একটি পুরানো প্রশ্ন, যাই হোক আমার পক্ষে কী কাজ করেছে তা আমি পোস্ট করতে যাচ্ছি।

আমার ওয়ার্কিং ডিরেক্টরিতে আমার কাছে দুটি ফাইল রয়েছে: ডকফেরফিল এবং প্রভিশন.শ

Dockerfile:

FROM centos:6.8

# put the script in the /root directory of the container
COPY provision.sh /root

# execute the script inside the container
RUN /root/provision.sh

EXPOSE 80

# Default command
CMD ["/bin/bash"]

provision.sh:

#!/usr/bin/env bash

yum upgrade

আমি কন্টেইনারটির বাইরে ফাইলটি chmod 700 provision.shচালানো হিসাবে চালানো হিসাবে ধারকটির বাইরে ফাইল সেট করে ডক ধারকটিতে ফাইলটি কার্যকর করতে সক্ষম হয়েছি docker build .

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