ডকার পাত্রে ভিতরে এসএসএইচ কীগুলি ব্যবহার করা


324

আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা গিটের সাথে বিভিন্ন মজাদার জিনিস চালায় (যেমন গিট ক্লোন ও গিট পুশ চালানো) এবং আমি এটি ডকার-আইজ করার চেষ্টা করছি।

কনটেইনার ব্যবহারকারীর ব্যবহারের জন্য আমাকে যেখানে কনটেইনারটিতে একটি এসএসএইচ কী যুক্ত করতে সক্ষম হওয়া প্রয়োজন সেখানে আমি একটি সমস্যা নিয়ে চলেছি running

আমি এটিকে অনুলিপি করার /root/.ssh/, পরিবর্তন করার $HOME, গিট এসএস র‍্যাপার তৈরি করার চেষ্টা করেছি এবং এখনও ভাগ্য নেই।

রেফারেন্সের জন্য এখানে ডকফায়াইল রয়েছে:

#DOCKER-VERSION 0.3.4                                                           

from  ubuntu:12.04                                                              

RUN  apt-get update                                                             
RUN  apt-get install python-software-properties python g++ make git-core openssh-server -y
RUN  add-apt-repository ppa:chris-lea/node.js                                   
RUN  echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN  apt-get update                                                             
RUN  apt-get install nodejs -y                                                  

ADD . /src                                                                       
ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa                             
RUN   cd /src; npm install                                                      

EXPOSE  808:808                                                                 

CMD   [ "node", "/src/app.js"]

app.js যেমন গিট কমান্ড চালায় git pull


3
এই প্রশ্নটির কাছে আসা যে কোনও ব্যক্তিকে ভাবা উচিত যদিও শেষ খেলাটি কোনও সুরক্ষা গর্ত তৈরি করা সহজ এবং আপনি যদি সতর্ক না হন তবে এখানে এটি ভুলে যাওয়া উচিত। সমস্ত উত্তর পড়ুন এবং বিজ্ঞতার সাথে চয়ন করুন।
জোশ হাবদাস

উত্তর:


144

আপনার যদি নির্মানের সময় এসএসএইচ ব্যবহারের প্রয়োজন হয় তবে এটি আরও শক্ত সমস্যা। উদাহরণস্বরূপ আপনি যদি ব্যবহার করছেন git clone, বা আমার ক্ষেত্রে pipএবং npmএকটি ব্যক্তিগত সংগ্রহস্থল থেকে ডাউনলোড করতে।

আমি যে সমাধানটি পেয়েছি তা হ'ল --build-argপতাকাটি ব্যবহার করে আপনার কীগুলি যুক্ত করা । তারপরে আপনি --squashস্তরগুলিকে একীভূত করতে নতুন পরীক্ষামূলক কমান্ডটি (1.13 যোগ করা) ব্যবহার করতে পারেন যাতে সরানোর পরে কীগুলি আর পাওয়া যায় না। এখানে আমার সমাধান:

বিল্ড কমান্ড

$ docker build -t example --build-arg ssh_prv_key="$(cat ~/.ssh/id_rsa)" --build-arg ssh_pub_key="$(cat ~/.ssh/id_rsa.pub)" --squash .

Dockerfile

FROM python:3.6-slim

ARG ssh_prv_key
ARG ssh_pub_key

RUN apt-get update && \
    apt-get install -y \
        git \
        openssh-server \
        libmysqlclient-dev

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh && \
    ssh-keyscan github.com > /root/.ssh/known_hosts

# Add the keys and set permissions
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \
    echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub && \
    chmod 600 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa.pub

# Avoid cache purge by adding requirements first
ADD ./requirements.txt /app/requirements.txt

WORKDIR /app/

RUN pip install -r requirements.txt

# Remove SSH keys
RUN rm -rf /root/.ssh/

# Add the rest of the files
ADD . .

CMD python manage.py runserver

আপডেট: আপনি যদি ডকার 1.13 ব্যবহার করছেন এবং পরীক্ষামূলক বৈশিষ্ট্যগুলি রয়েছে তবে আপনি --squashবিল্ড কমান্ডের সাথে সংযোজন করতে পারেন যা স্তরগুলি একত্রিত করবে, এসএসএইচ কীগুলি সরিয়ে ফেলবে এবং সেগুলি থেকে লুকিয়ে থাকবে docker history


13
এই গিটহাব ইস্যুর থ্রেডটি নির্দেশ করবে যে এই পদ্ধতিটি এখনও নিরাপদ নয়। অন্য অনুরূপ সমাধানের জন্য এই মন্তব্যটি দেখুন ।
eczajk

4
স্কোয়াশিংয়ের পরিবর্তে আর একটি সমাধান হ'ল একই আরএন কমান্ডের চাবিটি যুক্ত করা এবং মুছে ফেলা এবং আপনার যা প্রয়োজন তার জন্য এটি যুক্ত এবং অপসারণের মধ্যে।
বেনিয়ামিন হামার নারগার্ড

2
id_rsa.pubএটি প্রয়োজনীয় না হওয়ায় আপনি ফাইল তৈরির জন্য লাইনগুলি সরিয়ে ফেলতে পারেন ।
এলসিবি

1
স্কোয়াশিংয়ের পরিবর্তে মাল্টি স্টেজ ইমেজ বিল্ড ব্যবহার করুন ।
রিচার্ড কেফার

যদি আপনার কীটি পাসওয়ার্ড সুরক্ষিত থাকে তবে $(openssl rsa -in ~/.ssh/id_rsa)পরিবর্তে ব্যবহার করুন
ব্রুইসটসে

89

উবুন্টু ব্যবহার করার সময় দেখা যাচ্ছে, ssh_config সঠিক নয়। আপনি যোগ করা প্রয়োজন

RUN  echo "    IdentityFile ~/.ssh/id_rsa" >> /etc/ssh/ssh_config

আপনার এসকি কীটি সনাক্ত করতে এটি পেতে আপনার ডকফাইফিলের কাছে।


2
আপনার সম্ভবত RUN echo " Host example.com" >> /root/.ssh/config RUN echo " User <someusername>" >> /root/.ssh/config
এটির

1
কেন কেউ হোস্ট মেশিন থেকে একটি ধারক মধ্যে ব্যক্তিগত কী অনুলিপি করবে। কমান্ড ঠিক আছে, তবে আমি উল্লিখিতগুলি করার
কোনও বোধগম্যতা দেখছি না

12
এটি নিরাপদ নয়! ডকারের সর্বশেষ 1.13 সংস্করণের জন্য আমার সমাধানটি নীচে দেখুন। @ ইবেনসিং
ড্যানিয়েল ভ্যান ফ্লাইম্যান

1
@ ভ্লাদিমিরডজুরিমিক এখানে ডিপোপ্লাই কীগুলির মতো জিনিস রয়েছে।
জেলফির কাল্টসটহল

আসলে আপনাকে উবুন্টু ন্যূনতম ধারকটিতে সঠিকভাবে এসএসএস সেটআপ করতে ssh-keygen -A চালানো দরকার। তারপরে আপনি পাব / বেসিক কীগুলি যুক্ত করতে পারেন এবং এসএসডিডি শুরু করতে পারেন। আমার ডকফাইলে এই এন্ট্রিটি রয়েছে: একটি পদক্ষেপ হিসাবে 'RUN ssh-keygen -A'।
পাইওট্রেইকটি

84

দ্রষ্টব্য : কেবল ব্যক্তিগত এবং সর্বদা থাকবে এমন চিত্রগুলির জন্য এই পদ্ধতির ব্যবহার করুন !

Ssh কীটি চিত্রের মধ্যেই সঞ্চিত থাকে, আপনি কী যোগ করার পরে কোনও স্তর কমান্ডে কী সরিয়ে ফেললেও ( এই পোস্টে মন্তব্য দেখুন )।

আমার ক্ষেত্রে এটি ঠিক আছে, তাই এটি আমি ব্যবহার করছি:

# Setup for ssh onto github
RUN mkdir -p /root/.ssh
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

91
এটি আপনার কীটি ছবিতে রাখবে, এটি করবেন না।
সিপ্পলিয়ারার

12
@ সিপ্পলিয়নার আপনি ঠিক বলেছেন, এটি চিত্রটিতে কীটি সংরক্ষণ করে এবং এটি কোনও কোনও ক্ষেত্রে সুরক্ষা সমস্যা হতে পারে। যে হাইলাইট করার জন্য ধন্যবাদ। তবে অনেকগুলি পরিস্থিতি রয়েছে যেখানে এটি নিখুঁতভাবে সংরক্ষণ করা হয়। উদাহরণস্বরূপ, ব্যক্তিগত সংগ্রহস্থলগুলিতে সংরক্ষিত চিত্রগুলির জন্য, বা চিত্রগুলির স্থানীয় কীগুলি অনুলিপি করে কোনও প্রোডাকশন সার্ভারে নির্মিত এমন চিত্রগুলি।
yellowcap

2
এছাড়াও, আপনি যদি ডকফাইফিলের মধ্যে আপনার বিক্রেতাদের ইনস্টল করেন তবে একবার বিক্রেতারা ইনস্টল হয়ে গেলে আপনাকে এসএসএস কী সরিয়ে ফেলার কিছুই নেই nothing
SebScoFr

2
@ এসবস্কোএফআর, আপাতদৃষ্টিতে কীগুলি কোনও স্তরগুলির মধ্যে সংরক্ষণ করা হবে, এমনকি যদি আপনি পরবর্তী কমান্ডে মুছে ফেলেন (আপডেট উত্তরে লিঙ্কটি দেখুন)। সুতরাং চিত্রটি সর্বদা ssh কী উন্মোচিত করবে এবং সমাধানটি কেবলমাত্র ব্যক্তিগত চিত্রগুলির জন্যই ব্যবহার করা উচিত!
হলুদক্যাপ

1
আপনি যদি বিল্ডটি স্কোয়াশ করেন তবে @ হাইলোক্যাপটি নয়
অ্যানয়েজ

56

আপনি যদি ডকার রচনা ব্যবহার করছেন তবে একটি সহজ পছন্দ হ'ল এসএসএইচ এজেন্টকে ফরোয়ার্ড করা:

something:
    container_name: something
    volumes:
        - $SSH_AUTH_SOCK:/ssh-agent # Forward local machine SSH key to docker
    environment:
        SSH_AUTH_SOCK: /ssh-agent

23
কেবল একটি নোট যে ম্যাক হোস্টের পক্ষে এটি কার্যকর হয় না, ডকার-মেশিন ব্যবহার করে (ভার্চুয়ালবক্সের মাধ্যমে) বা ম্যাকের জন্য ডকার (যা xhyve ব্যবহার করে) কারণ ইউনিক্স ডোমেন সকেটগুলি প্রক্সড নয়।
জো শ

SSH_AUTH_SOCKএকটি পরিবর্তনশীল, যা কোনও
এসএস


1
ssh-ফরওয়ার্ডিং এখন ম্যাকওএস হোস্টগুলিতে সমর্থিত - এর পাথটি মাউন্ট করার পরিবর্তে $SSH_AUTH_SOCK, আপনাকে এই পাথটি মাউন্ট করতে হবে - /run/host-services/ssh-auth.sock
জাকুব কুকুল

47

পিটার গ্রেনজারের উত্তরটি প্রসারিত করে আমি ডকার ১.0.০৫ সাল থেকে উপলব্ধ মাল্টি-স্টেজ বিল্ডটি ব্যবহার করতে সক্ষম হয়েছি । অফিসিয়াল পৃষ্ঠাতে বলা হয়েছে:

মাল্টি-স্টেজ বিল্ডগুলি সহ, আপনি FROMআপনার ডকফাইফিলে একাধিক বিবৃতি ব্যবহার করেন । প্রতিটি FROMনির্দেশ পৃথক বেস ব্যবহার করতে পারে এবং তাদের প্রতিটি বিল্ডের একটি নতুন পর্যায়ে শুরু করে। আপনি চূড়ান্ত চিত্রটিতে যা চান না তার সমস্ত কিছুই রেখে, বাছাই করে এক পর্যায় থেকে অন্য পর্যায়ে অনুলিপিগুলি অনুলিপি করতে পারেন।

এখানে এটি মাথায় রেখে Dockerfileতিনটি বিল্ড স্টেজ অন্তর্ভুক্ত করার আমার উদাহরণ । এর অর্থ ক্লায়েন্ট ওয়েব অ্যাপ্লিকেশনটির একটি উত্পাদন চিত্র তৈরি করা।

# Stage 1: get sources from npm and git over ssh
FROM node:carbon AS sources
ARG SSH_KEY
ARG SSH_KEY_PASSPHRASE
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh && \
    ssh-keyscan bitbucket.org > /root/.ssh/known_hosts && \
    echo "${SSH_KEY}" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa
WORKDIR /app/
COPY package*.json yarn.lock /app/
RUN eval `ssh-agent -s` && \
    printf "${SSH_KEY_PASSPHRASE}\n" | ssh-add $HOME/.ssh/id_rsa && \
    yarn --pure-lockfile --mutex file --network-concurrency 1 && \
    rm -rf /root/.ssh/

# Stage 2: build minified production code
FROM node:carbon AS production
WORKDIR /app/
COPY --from=sources /app/ /app/
COPY . /app/
RUN yarn build:prod

# Stage 3: include only built production files and host them with Node Express server
FROM node:carbon
WORKDIR /app/
RUN yarn add express
COPY --from=production /app/dist/ /app/dist/
COPY server.js /app/
EXPOSE 33330
CMD ["node", "server.js"]

.dockerignore.gitignoreফাইলের বিষয়বস্তু পুনরাবৃত্তি করে (এটি প্রকল্পের ডিরেক্টরিগুলি অনুলিপি করা থেকে বাধা দেয় node_modulesএবং ফলস্বরূপ dist):

.idea
dist
node_modules
*.log

একটি চিত্র নির্মাণের জন্য কমান্ড উদাহরণ:

$ docker build -t ezze/geoport:0.6.0 \
  --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" \
  --build-arg SSH_KEY_PASSPHRASE="my_super_secret" \
  ./

যদি আপনার ব্যক্তিগত এসএসএইচ কী-তে কোনও পাসফ্রেজ না থাকে তবে খালি SSH_KEY_PASSPHRASEযুক্তি নির্দিষ্ট করুন ।

এটা এভাবে কাজ করে:

1)। শুধুমাত্র প্রথম পর্যায়ে package.json, yarn.lockফাইল এবং ব্যক্তিগত এসএসএইচ কী প্রথমে অন্তর্বর্তী চিত্রটির অনুলিপি করা হয় sources। আরও এসএসএইচ কী পাসফ্রেজ এড়াতে অনুরোধ জানায় এটি স্বয়ংক্রিয়ভাবে যুক্ত হয়ে যায় ssh-agent। শেষ yarnঅবধি কমান্ডটি এনপিএম থেকে সমস্ত প্রয়োজনীয় নির্ভরতা ইনস্টল করে এবং এসএসএইচ-র বিটবকেট থেকে ব্যক্তিগত গিট সংগ্রহস্থলগুলি ক্লোন করে।

2)। দ্বিতীয় পর্যায়ে ওয়েব অ্যাপ্লিকেশনের উত্স কোডটি তৈরি করে এবং তা ছোট করে এবং distএটি পরবর্তী মধ্যবর্তী চিত্রটির ডিরেক্টরিতে রাখে production। নোট করুন যে ইনস্টল করা উত্স কোডটি এই লাইনের মাধ্যমে প্রথম পর্যায়ে উত্পাদিত node_modulesচিত্র থেকে অনুলিপি করা হয়েছে sources:

COPY --from=sources /app/ /app/

সম্ভবত এটি নিম্নলিখিত লাইনও হতে পারে:

COPY --from=sources /app/node_modules/ /app/node_modules/

আমরা কেবলমাত্র আছে node_modulesএখানে কোন প্রথম অন্তর্বর্তী ইমেজ থেকে ডিরেক্টরি, SSH_KEYএবং SSH_KEY_PASSPHRASEআর্গুমেন্ট আর। বিল্ডের জন্য প্রয়োজনীয় সমস্তগুলি আমাদের প্রকল্প ডিরেক্টরি থেকে অনুলিপি করা হয়েছে।

3)। তৃতীয় পর্যায়ে আমরা চূড়ান্ত চিত্রটির একটি আকার হ্রাস করব ezze/geoport:0.6.0যা কেবলমাত্র ওয়েব সার্ভার শুরু করার জন্য নোড এক্সপ্রেস distনামের দ্বিতীয় মধ্যবর্তী চিত্র থেকে কেবল ডিরেক্টরি অন্তর্ভুক্ত করে ট্যাগ করা হবে production

তালিকাবদ্ধ চিত্রগুলি এর ফলে একটি আউটপুট দেয়:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ezze/geoport        0.6.0               8e8809c4e996        3 hours ago         717MB
<none>              <none>              1f6518644324        3 hours ago         1.1GB
<none>              <none>              fa00f1182917        4 hours ago         1.63GB
node                carbon              b87c2ad8344d        4 weeks ago         676MB

যেখানে ট্যাগবিহীন চিত্রগুলি প্রথম এবং দ্বিতীয় মধ্যবর্তী বিল্ড পর্যায়ে সংশোধন করে।

আপনি যদি চালান

$ docker history ezze/geoport:0.6.0 --no-trunc

আপনি চূড়ান্ত চিত্র SSH_KEYএবং এর কোনও উল্লেখ দেখতে পাবেন না SSH_KEY_PASSPHRASE


পুরানো পোস্ট, তবে আমি জোর দিয়ে বলতে চাই এটি 18.09 পূর্বের আগে করার সেরা উপায়। স্কোয়াশ অপ্রয়োজনীয় এবং ঝুঁকিপূর্ণ। মাল্টি-স্টেজ সহ, আপনি জানেন যে আপনি কেবল নিজের পছন্দসই নিদর্শনগুলি নিয়ে আসছেন। আপনি চান না এমন ফাইলগুলির স্কোয়াশটিকে অপ্ট-আউট হিসাবে এবং মাল্টিস্টেজটিকে অপ্ট-ইন হিসাবে ভাবেন। এই উত্তরটি আরও বেশি হওয়া দরকার। ইমেজে আপনার ssh কী বেক করা ভয়ঙ্কর অনুশীলন।
মিতালিয়ান

@ezze এই খুব দরকারী পোস্টের জন্য আপনাকে অনেক ধন্যবাদ :) এসএসএইচ-এজেন্ট আমাকে পাগল করছে, আপনি যা করেছেন তার মতোই আমি কিছু করেছি: আমি সঠিকভাবে ডকার বিল্ড লগগুলিতে দেখতে পাই Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)তবে যখন আমি অন্য কোনও আরএন বা এমনকি একই আরএন-তে চেক করি তখন কমান্ডটি ssh-add -lএটি করে আমাকে বলে যে "এজেন্টের কোনও পরিচয় নেই"। আমার চুল কেটে টানা শুরু, কোন চিন্তা?
অ্যালেক্স

40

আপনার ssh কী ইনজেক্ট করার জন্য, একটি ধারক মধ্যে, আপনার একাধিক সমাধান রয়েছে:

  1. ADDনির্দেশিকা সহ একটি ডকফায়াইল ব্যবহার করে , আপনি এটি আপনার বিল্ড প্রক্রিয়া চলাকালীন ইনজেক্ট করতে পারেন

  2. সহজভাবে কিছু করছেন cat id_rsa | docker run -i <image> sh -c 'cat > /root/.ssh/id_rsa'

  3. docker cpকমান্ডটি ব্যবহার করা হচ্ছে যা একটি ধারক চলমান অবস্থায় আপনাকে ফাইলগুলি ইনজেক্ট করতে দেয়।


2
সুতরাং, এখন পর্যন্ত, আমি এটিকে /root/.ssh/id_rsa এ অনুলিপি করার চেষ্টা করেছি তবে এখনও "হোস্ট কী যাচাইকরণ ব্যর্থ হয়েছে fat যে কোনও কারণে কীটি ব্যবহার করা হচ্ছে না। সুতরাং আমি ভাবছি অন্য কিছু করার দরকার আছে যা আসলে সিস্টেমকে এটি ssh কী হিসাবে ব্যবহার করার জন্য বলতে হবে? ঠিক কীভাবে এটি ডিবাগ করবেন তা নিশ্চিত নন। (এবং আমি জানি যে এই কীটি কাজ করে কারণ এটি হোস্টের ইস্যু ছাড়াই চলে)

আপনি কি নিশ্চিত করতে পারেন যে / etc / ssh / ssh_config সঠিক কী ফাইলটিকে লক্ষ্য করে?
23

1
ডকার কনটেইনার ফাইলগুলি পরীক্ষা করার জন্য কি কোনও ভাল উপায় আছে? বা আমি কি কেবল একটি বৈধ কনফিগারেশনে কপি করে চেষ্টা করব?
এবেন্সিং

3
আমি কেবল 'বেস' চিত্রটি দিয়ে চেষ্টা করেছি, / apt-get install openssh-serverকিআরটি / এসএসএস / আইডি_আরসে আমার কীটি রেখেছি এবং এটি দুর্দান্ত কাজ করেছে। আপনি কোন চিত্র ব্যবহার করছেন?
creack

আপনার যদি কোনও ধারকের ফাইলটি পরীক্ষা করতে হয়, তবে সর্বোত্তম উপায় হ'ল 'বিড়াল' দিয়ে ফলাফলটি প্রতিশ্রুতিবদ্ধ করা এবং চালানো।
23

15

একটি ক্রস-প্ল্যাটফর্ম সমাধান হ'ল হোস্টের ফোল্ডারটি ধারকটিতে ভাগ করতে একটি বাঁধাই মাউন্ট ব্যবহার .sshকরা হয়:

docker run -v /home/<host user>/.ssh:/home/<docker user>/.ssh <image>

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


1
এটি কার্যকর হতে পারে তবে docker buildকেবল সময়ে docker run
আলেকজান্ডার মিলস

3
ঠিক এটাই কথা। আপনি আপনার এসএস কীগুলি কোনও ডকার ফাইলের মধ্যে রাখতে চান না।
মোহাম্মদ আজিম

2
প্রদত্ত এসএসএইচ এজেন্ট ফরোয়ার্ডিং লিনাক্সের বাইরে কাজ করে না এটি একটি প্রচুর গোলমাল ছাড়াই উন্নয়নের পরিবেশে চালিয়ে আসার জন্য সূক্ষ্ম সমাধান করে।
জোশ হাবদাস

আমি docker-compose upআমার স্থানীয় উইন্ডোজ ১০-এ ব্যবহার করে ডকার চালাচ্ছি that দৃশ্যে আমার সমাধানটি কীভাবে ব্যবহার করা উচিত?
লালাআলু

মূলত আপনি কীভাবে ডকার রচনায় ভলিউম মানচিত্র করবেন তা জিজ্ঞাসা করছেন। উপরে এর উত্তর দেওয়া আছে। বিশেষত উইন্ডোজের জন্য এটি স্ট্যাকওভারফ্লো
মোহাম্মদ আজিম

14

ডকারের পাত্রে তাদের নিজস্ব 'পরিষেবা' হিসাবে দেখা উচিত। উদ্বেগ পৃথক করতে আপনার কার্যকারিতা পৃথক করা উচিত:

1) ডেটা কোনও ডেটা ধারক হওয়া উচিত: রেপো ক্লোন করতে একটি লিঙ্কযুক্ত ভলিউম ব্যবহার করুন। সেই ডেটা ধারকটি তার পরে প্রয়োজনীয় পরিষেবার সাথে যুক্ত হতে পারে।

২) গিট ক্লোনিং টাস্ক চালানোর জন্য একটি ধারক ব্যবহার করুন, (যখন এটি কেবল কাজ ক্লোনিং is) আপনি যখন এটি চালাবেন তখন ডেটা ধারকটিকে এটির সাথে যুক্ত করুন।

3) ssh-key এর জন্য একই: এটি একটি ভলিউম রাখুন (উপরে প্রস্তাবিত হিসাবে) এবং আপনার যখন প্রয়োজন হয় তখন গিট ক্লোন পরিষেবাতে এটি লিঙ্ক করুন

এইভাবে, ক্লোনিং কার্য এবং কী উভয়ই সংক্ষিপ্ত এবং শুধুমাত্র যখন প্রয়োজন হয় তখন সক্রিয়।

এখন যদি আপনার অ্যাপ্লিকেশন নিজেই গিট ইন্টারফেস হয় তবে আপনি সরাসরি আপনার কাজটি করতে গিথব বা বিটবকেট আরএসটি এপিআই বিবেচনা করতে পারেন: এগুলি তাদের জন্য ডিজাইন করা হয়েছিল।


13

এই লাইনটি একটি সমস্যা:

ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa

আপনি ইমেজটিতে অনুলিপি করতে চান ফাইল নির্দিষ্ট করার সময় আপনি কেবল আপেক্ষিক পাথ ব্যবহার করতে পারেন - আপনার ডকফেরিল যেখানে রয়েছে সেই ডিরেক্টরিটির তুলনায়। সুতরাং আপনার পরিবর্তে ব্যবহার করা উচিত:

ADD id_rsa /root/.ssh/id_rsa

এবং id_rsa ফাইলটিকে একই ডিরেক্টরিতে রাখুন যেখানে আপনার ডকফেরফিল রয়েছে।

আরও বিশদ জানতে এটি পরীক্ষা করে দেখুন: http://docs.docker.io/references/builder/#add


4
এটি সুরক্ষা সমস্যা কারণ এটি একটি ব্যক্তিগত কী একটি চিত্রে রাখে যা সহজেই ভুলে যেতে পারে।
মাইক ডি

docker cpএটি কেবল পাত্রে রাখুন এবং চিত্রটি নেই, তাই না?
আলেকজান্ডার মিলস

13

ডকার বিল্ড টাইমে এনপিএম ইনস্টল করার সময় আমাদের একই সমস্যা হয়েছিল।

ড্যানিয়েল ভ্যান ফ্লাইম্যানের সমাধান থেকে অনুপ্রাণিত হয়ে এবং এটি গিট ইউআরএল পুনর্লিখনের সাথে একত্রিত করে , আমরা ব্যক্তিগত গিথুব রেপো থেকে এনপিএম ইনস্টল অনুমোদনের জন্য কিছুটা সহজ পদ্ধতি খুঁজে পেয়েছি - আমরা কীগুলির পরিবর্তে ওউথ 2 টোকেন ব্যবহার করেছি।

আমাদের ক্ষেত্রে, এনএমপি নির্ভরতাগুলি "গিট + https://github.com/ ..." হিসাবে নির্দিষ্ট করা হয়েছিল

ধারকটিতে প্রমাণীকরণের জন্য, ইউএসএলগুলি ssh প্রমাণীকরণের (ssh: //git@github.com/) বা টোকেন প্রমাণীকরণের জন্য উপযুক্ত হতে আবার লিখতে হবে (https: // $ IT GITHUB_TOKEN} @ github.com /)

বিল্ড কমান্ড:

docker build -t sometag --build-arg GITHUB_TOKEN=$GITHUB_TOKEN . 

দুর্ভাগ্যক্রমে, আমি ডকরে 1.9 এ আছি, সুতরাং - স্কোয়াশ বিকল্পটি এখনও নেই, শেষ পর্যন্ত এটি যুক্ত করা দরকার

Dockerfile:

FROM node:5.10.0

ARG GITHUB_TOKEN

#Install dependencies
COPY package.json ./

# add rewrite rule to authenticate github user
RUN git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"

RUN npm install

# remove the secret token from the git config file, remember to use --squash option for docker build, when it becomes available in docker 1.13
RUN git config --global --unset url."https://${GITHUB_TOKEN}@github.com/".insteadOf

# Expose the ports that the app uses
EXPOSE 8000

#Copy server and client code
COPY server /server 
COPY clients /clients

11

ধারকটিতে ssh প্রমাণীকরণ সকেট ফরোয়ার্ড করুন:

docker run --rm -ti \
        -v $SSH_AUTH_SOCK:/tmp/ssh_auth.sock \
        -e SSH_AUTH_SOCK=/tmp/ssh_auth.sock \
        -w /src \
        my_image

আপনার স্ক্রিপ্ট একটি সম্পাদন করতে সক্ষম হবে git clone

অতিরিক্ত: আপনি যদি ক্লোন করা ফাইলগুলি কোনও নির্দিষ্ট ব্যবহারকারীর অন্তর্ভুক্ত করতে চান তবে আপনার ধারকটির chownঅভ্যন্তরের রুটের চেয়ে অন্য ব্যবহারকারী ব্যবহার করা gitব্যর্থ হবে।

আপনি ধারক পরিবেশে এই প্রকাশনাটি কিছু অতিরিক্ত ভেরিয়েবল করতে পারেন:

docker run ...
        -e OWNER_USER=$(id -u) \
        -e OWNER_GROUP=$(id -g) \
        ...

আপনি ক্লোন করার পরে আপনার ধারকটি chown $OWNER_USER:$OWNER_GROUP -R <source_folder>ছাড়ার আগে যথাযথ মালিকানা সেট করতে আপনাকে অবশ্যই নির্বাহ করতে হবে যাতে ধারকগুলির বাইরে কোনও রুটহীন ব্যবহারকারী দ্বারা ফাইলগুলি অ্যাক্সেসযোগ্য হয়।


1
নতুন ডকার সংস্করণগুলিতে আপনি -u root:$(id -u $USER)কমপক্ষে আপনার ব্যবহারকারীর মতো একই প্রাথমিক গোষ্ঠীর মালিকানাধীন ফাইলগুলি পাস করতে পারেন যা sudoকিছু 0600অনুমতি ছাড়াই তৈরি না করে সেগুলি কমপক্ষে পঠনযোগ্য হওয়া উচিত ।
ড্রাগন 788

@ ড্রাগন 8৮৮ আমার মনে হয় আপনার টাইপো আছে: -u root:$(id -u $USER)হওয়া উচিত -g
এডুপো

ভাল কল! মোবাইল থেকে এটি ঠিক করতে সক্ষম বলে মনে হচ্ছে না, শীঘ্রই ডেস্কটপে চেষ্টা করব।
ড্রাগন 788

আমি /tmp/ssh_auth.sock: No such file or directoryএখন এটি /tmp/ssh-vid8Zzi8UILE/agent.46016আমার হোস্ট মেশিনে
রেখেছি

@ ভ্লাদক্রাস ত্রুটিটি বেশ জেনেরিক। /tmpআপনার ধারকটির ভিতরে অনুমতি থাকার কারণে হতে পারে । বা ডকার রান কমান্ডে একটি টাইপো। বাইন্ডের বিবৃতিটি সঠিক কিনা তা নিশ্চিত করুন -v $SSH_AUTH_SOCK:/tmp/ssh_auth.sock: অর্ডার গুরুত্বপূর্ণ এবং সেমিকোলনও গুরুত্বপূর্ণ। আরও সহায়তার জন্য দয়া করে ডকার ডকুমেন্টেশন চেক করুন ।
এডুপো

10

যেমন ইজাজ্ক ড্যানিয়েল ভ্যান ফ্লাইম্যানের উত্তরে ইতিমধ্যে মন্তব্য করেছে, কীগুলি অপসারণ এবং ব্যবহার করা নিরাপদ বলে মনে হয় না --squash, কারণ সেগুলি এখনও ইতিহাসে দৃশ্যমান হবে ( docker history --no-trunc)।

18.09 ডকারের পরিবর্তে, আপনি এখন "বিল্ড সিক্রেটস" বৈশিষ্ট্যটি ব্যবহার করতে পারেন। আমার ক্ষেত্রে আমি আমার হোস্ট এসএসএইচ কীটি আমার ডকফাইলে নিম্নলিখিতটি দিয়ে একটি ব্যক্তিগত গিট রেপো ক্লোন করেছি:

# syntax=docker/dockerfile:experimental

[...]

RUN --mount=type=ssh git clone [...]

[...]

এটি ব্যবহারে সক্ষম হতে, চালানোর আগে আপনাকে নতুন বিল্ডকিট ব্যাকএন্ড সক্ষম করতে হবে docker build:

export DOCKER_BUILDKIT=1

এবং আপনাকে --ssh defaultপ্যারামিটারটি যুক্ত করতে হবে docker build

এ সম্পর্কে আরও তথ্য এখানে: https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066


1
সেরা সমাধান আইএমএইচও। এটি কাজ করার জন্য আমাকে আরও দুটি জিনিস করতে হয়েছিল: 1) আমার প্রাইভেট কীটি এসএসএল-এজেন্টের সাথে যুক্ত করুন ssh-add ~/.ssh/id_rsaএবং 2) গিট হোস্টটি পরিচিত_হোস্টগুলিতে যুক্ত করুন, অর্থাত্ বিটবাকেটের জন্য:RUN ssh-keyscan -H bitbucket.org >> ~/.ssh/known_hosts
মরিটজ রিংলার

আমি এটি কাজ করতে মোটেও সক্ষম হইনি। আমি এখনও অনুমতি ত্রুটি পেয়েছি: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access and the repository exists.এটি --ssh defaultআমার ডকার বিল্ডে পতাকা পাস করার পরেও , এবং --mount=type=sshআমি যেখানে রান কমান্ড ব্যবহার করছি তা সত্ত্বেও git clone। আমি একই রেপো ক্লোন করতে সক্ষম হয়েছি বিল্ড মেশিনে কোনও সমস্যা নেই। এটি সহজেই ডকার বিল্ড পাত্রে ব্যর্থ হয়। আমার সন্দেহ হয় যে ডকারের ম্যাক সংস্করণটি আসলে এসএসএস ক্লায়েন্টের সাথে পাস করছে না।
প্রধানমন্ত্রী

@ পি মেন্দে আপনি যে বিষয়টি উল্লেখ করেছেন তা বুঝতে পেরেছিলেন কারণ আমিও এর মুখোমুখি হয়েছি।
সদান এ

@ সাদানআরশাদ এটি প্রমাণ করে যে আপনি যদি কোনও লিনাক্স মেশিন থেকে ডকার চালাচ্ছেন তবে এই কার্যকারিতাটি বর্তমানে সমর্থিত। যদি আপনি ম্যাক থেকে আপনার ডকার কমান্ডগুলি চালাচ্ছেন তবে এটি কার্যকর হয় না (এবং সম্ভবত উইন্ডোজও, যদিও আমি নিশ্চিত করতে পারি না)।
PMende

খুব খারাপ যে ডকার-রচনা নিয়ে কাজ করে না ... github.com/docker/compose/issues/6440
উইলকে

9

এই সমস্যাটি আসলেই একটি বিরক্তিকর। যেহেতু আপনি ডকফেরাইল প্রসঙ্গে বাইরের কোনও ফাইল যুক্ত / অনুলিপি করতে পারবেন না, যার অর্থ কেবলমাত্র ~ / .ssh / id_rsa চিত্রের /root/.ssh/id_rsa এর সাথে লিঙ্ক করা অসম্ভব এবং যখন আপনার অবশ্যই কিছু শেড করার জন্য কী প্রয়োজন হবে আপনার ডকার ইমেজ তৈরির সময়, কোনও ব্যক্তিগত রেপো লিঙ্ক থেকে গিট ক্লোনটির মতো ...

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

  1. আপনার ডকফাইলে:

    • এই ফাইলটিকে /root/.ssh/id_rsa হিসাবে যুক্ত করুন
    • আপনি যা চান তা করুন, যেমন গিট ক্লোন, সুরকার ...
    • rm /root/.ssh/id_rsa শেষে
  2. একটি স্ক্রিপ্ট করতে একটি স্ক্রিপ্ট:

    • ফোল্ডারে ডকফাইফিল হোল্ডারে আপনার কী সিপি করুন
    • ডকার বিল্ড
    • অনুলিপি চাবি আরএম
  3. যে কোনও সময় আপনাকে কিছু ssh প্রয়োজনীয়তা সহ এই চিত্র থেকে একটি ধারক চালাতে হবে, রান কমান্ডের জন্য কেবল -v যোগ করুন, যেমন:

    ডকার রান -v ~ / .ssh / id_rsa: /root/.ssh/id_rsa - নাম ধারক ইমেজ কমান্ড

এই সমস্যার ফলে আপনার প্রকল্পের উত্স এবং বিল্ট ডকার চিত্র উভয়ই কোনও প্রাইভেট কী নেই, সুতরাং আর কোনও উদ্বেগের জন্য সুরক্ষা সমস্যা নেই।


1
"যেহেতু আপনি ডকফেরাইল প্রসঙ্গে বাইরে কোনও ফাইল যুক্ত / অনুলিপি করতে পারবেন না," আপনি কি দেখেছেন docker cp? এটি "একটি ধারক এবং আপনার হোস্টের মধ্যে ফাইল / ফোল্ডার অনুলিপি করতে ব্যবহৃত হয়"।
জোনাথন রাইনহার্ট

@ জোনাথনরাইনহার্ট, এটি দেখানোর জন্য ধন্যবাদ। হ্যাঁ, docker cpকৌতুক করতে পারে। তবে এই খুব পরিস্থিতিতে, ছবিটি তৈরি হওয়ার সময় আমার ssh_key দরকার ছিল, এবং সেই সময় কোনও ধারক নেই ... আমার অস্পষ্ট প্রকাশটি আপডেট করবে, যাইহোক ধন্যবাদ।
ইমলিও

9

আমি আজ একই সমস্যায় পড়েছি এবং পূর্ববর্তী পোস্টগুলির সাথে সামান্য সংশোধিত সংস্করণটি আমি এই পদ্ধতির জন্য আমার কাছে আরও দরকারী বলে মনে করি

docker run -it -v ~/.ssh/id_rsa:/root/.my-key:ro image /bin/bash

(মনে রাখবেন যে কেবলমাত্র পঠনীয় পতাকা তাই ধারক কোনও ক্ষেত্রে আমার এসএস কীটি গোলমাল করবে না))

ধারক ভিতরে আমি এখন চালাতে পারি:

ssh-agent bash -c "ssh-add ~/.my-key; git clone <gitrepourl> <target>"

সুতরাং আমি সেই Bad owner or permissions on /root/.ssh/..ত্রুটিটি পাই না যা @ ক্রস দ্বারা নোট করা হয়েছিল


ধন্যবাদ! মত একটি কমান্ডের মধ্যে SSH-এজেন্ট এবং SSH-অ্যাড থাকার: এই কী এটা আমার জন্য কাজ করে তার জন্য ছিল: ssh-agent bash -c "ssh-add..."। আমি তারপরে ডকের রান এ ডান পাশ করতে পারি। পূর্ববর্তী সমস্ত উদাহরণগুলি আমি ব্যবহার eval ssh-agentকরেছি এবং এর পরে এসএসএড-অ্যাড পেয়েছি evalএবং ডকার রান কমান্ডের মাধ্যমে আমি এটি পাস করার কোনও উপায় বের করতে পারি না ।
রায়ানম্যান

7

'আপনি নির্বাচিতভাবে দূরবর্তী সার্ভারগুলিকে আপনার স্থানীয় এসএস-এজেন্টকে অ্যাক্সেস করতে দিতে পারেন যেমন এটি সার্ভারে চলছে running'

https://developer.github.com/guides/using-ssh-agent-forwarding/


4
ডকার রান -i -t -v $ (রিডলিংক-ফ $ এসএসএইচ_আউথ_সোক): / এসএসএইচ-এজেন্ট -এসএসএইচ_আউথ_সোক = / এসএস-এজেন্ট উবুন্টু / বিন / বাশ
পাভেল হ্লোবিল

1
ফ্রুটল পি এই ফ্যাশনে একটি ডকার-টানেল ধারক তৈরি করেছে: github.com/kingsquare/docker-tunnel
মার্টিন সুচানেক

6

আপনি আপনার .ssh ডিরেক্টরিটিকে হোস্ট এবং ধারকটির মধ্যেও সংযুক্ত করতে পারেন, আমি জানি না এই পদ্ধতিতে কোনও সুরক্ষা জড়িত আছে কিনা তবে এটি সবচেয়ে সহজ পদ্ধতি হতে পারে। এর মতো কিছু কাজ করা উচিত:

$ sudo docker run -it -v /root/.ssh:/root/.ssh someimage bash

মনে রাখবেন যে ডকার সুডো দিয়ে চলেছে (যদি না আপনি না থাকেন), যদি এটি হয় তবে আপনি মূল ssh কীগুলি ব্যবহার করবেন।


এই পদ্ধতিটি ব্যবহার করা ডকার 0.11 এর সাথে কাজ করে তবে আপনি যদি ডুমুর ব্যবহার করেন তবে এটি প্যানিক ত্রুটি ছুঁড়ে দেবে। আমি জানি না কেন
লুইস এলিজন্ডো

3
এটি একটি পছন্দসই পদ্ধতি হবে, কৌশলটি আমার অপ্রতিযুক্ত হোস্ট ব্যবহারকারীর কীগুলি ধারকটির মূল হিসাবে ব্যবহার করা হবে। আপনি উল্লেখ হিসাবে, হোস্ট রুট ব্যবহারকারী ফলন হিসাবে এটি না করার চেষ্টা করছেন Bad owner or permissions on /root/.ssh/config
ক্রস

এটি কেবলমাত্র সময় ব্যবহার করা যেতে পারে docker runতবে সময়কালে নয় docker build
সিসিপিজ্জা

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

6

docker API 1.39+(এর সাথে API এর সংস্করণটি পরীক্ষা করুন docker version) থেকে শুরু করে ডকার বিল্ডটি অনুমতি দেয়--ssh কোনও এজেন্ট সকেট বা কীগুলির সাহায্যে ডকার ইঞ্জিনকে এসএসএইচ এজেন্ট সংযোগগুলি ফরোয়ার্ড করার অনুমতি দেওয়ার জন্য মঞ্জুরি দেয়।

বিল্ড কমান্ড

export DOCKER_BUILDKIT=1
docker build --ssh default=~/.ssh/id_rsa .

Dockerfile

# syntax=docker/dockerfile:experimental
FROM python:3.7

# Install ssh client (if required)
RUN apt-get update -qq
RUN apt-get install openssh-client -y

# Download public key for github.com
RUN --mount=type=ssh mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Clone private repository
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject

অধিক তথ্য:


1
টিলডের সম্প্রসারণ আমার পক্ষে কাজ করে নি; আমি পেয়েছিলাম: could not parse ssh: [default=~/.ssh/id_rsa]: stat ~/.ssh/id_rsa: no such file or directory। যদি কাজ না করে তবে পুরো পথটি ব্যবহার করুন।
ছোঁয়া

3

আপনি যদি আপনার এসএসএইচ কীগুলির সুরক্ষা সম্পর্কে চিন্তা না করেন তবে এখানে অনেক ভাল উত্তর রয়েছে। যদি আপনি না, সবচেয়ে ভালো উত্তর আমি পাওয়া উপরে একটি মন্তব্য একটি লিঙ্ক থেকে এই GitHub মন্তব্য দ্বারা diegocsandrim । যাতে অন্যরা এটি দেখার সম্ভাবনা বেশি থাকে এবং কেবল রেপো যদি কখনও চলে যায়, তবে এই উত্তরটির একটি সম্পাদিত সংস্করণ এখানে দেওয়া হল:

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

আমরা aws s3 ক্লিপ দিয়ে কীটি অ্যাক্সেস করার জন্য একটি প্রাক-সাইন ইউআরএল তৈরি করি এবং প্রায় 5 মিনিটের জন্য অ্যাক্সেসকে সীমাবদ্ধ করি, আমরা এই প্রাক-সাইন ইউআরএলটি রেপো ডিরেক্টরিতে একটি ফাইলে সংরক্ষণ করি, তারপরে ডকফেরফিলিতে আমরা এটিকে চিত্রটিতে যুক্ত করি।

ডকফাইফিলে আমাদের একটি রুন কমান্ড রয়েছে যা এই সমস্ত পদক্ষেপগুলি করে: এসএসএস কী পেতে এনটিএম ইনস্টল চালানো, এবং এসএসএস কী সরাতে প্রি-সিং ইউআরএল ব্যবহার করুন।

একক কমান্ডে এটি করে ssh কী কোনও স্তরে সংরক্ষণ করা হবে না, তবে প্রাক-সাইন ইউআরএল সংরক্ষণ করা হবে, এবং এটি কোনও সমস্যা নয় কারণ URLটি 5 মিনিটের পরে বৈধ হবে না।

বিল্ড স্ক্রিপ্টটি দেখতে:

# build.sh
aws s3 presign s3://my_bucket/my_key --expires-in 300 > ./pre_sign_url
docker build -t my-service .

ডকফেরফাইল দেখতে এরকম দেখাচ্ছে:

FROM node

COPY . .

RUN eval "$(ssh-agent -s)" && \
    wget -i ./pre_sign_url -q -O - > ./my_key && \
    chmod 700 ./my_key && \
    ssh-add ./my_key && \
    ssh -o StrictHostKeyChecking=no git@github.com || true && \
    npm install --production && \
    rm ./my_key && \
    rm -rf ~/.ssh/*

ENTRYPOINT ["npm", "run"]

CMD ["start"]

1
এই সমাধানটির সমস্যাটি হ'ল যেহেতু প্রতিবার প্রাক_সাইন_আরএল পরিবর্তন হবে, এনপিএম ইনস্টল ক্যাশে করা যায় না এমনকি প্যাকেজ.জসন ফাইলে কোনও পরিবর্তন নেই। বিল্ড.শ এর চাবিটি পাওয়া এবং এটি একটি বিল্ড আর্গুমেন্ট হিসাবে সেট করা ভাল যাতে এটি প্রতিবার পরিবর্তিত হয় না
ইয়র্ক ইয়াং

3

ডকারের পরবর্তী সংস্করণগুলিতে (17.05) আপনি একাধিক পর্যায়ের বিল্ড ব্যবহার করতে পারেন । পূর্ববর্তী বিল্ডগুলি কেবল পরের বিল্ড দ্বারা কেবল কখনও ব্যবহার করা যেতে পারে এবং তারপরে ধ্বংস হয়ে যায় বলে সবচেয়ে নিরাপদ বিকল্প

আরও তথ্যের জন্য আমার স্ট্যাকওভারফ্লো প্রশ্নের উত্তর দেখুন


3

ডকারের ধারকগুলির মধ্যে এসএসএইচ-এর চ্যালেঞ্জগুলির একটি সংক্ষিপ্ত বিবরণ এখানে বিশদভাবে বর্ণনা করা হয়েছে । গোপন রহস্য ছাড়াই একটি ধারক থেকে বিশ্বস্ত রিমোটগুলিতে সংযোগের জন্য কয়েকটি উপায় রয়েছে:

এর বাইরেও কমপোজ ব্যবহার করার সময় রান-টাইমে অ্যাক্সেসযোগ্য একটি আলাদা ডকার পাত্রে কী-স্টোর চলার সম্ভাবনা রয়েছে। হাশিকর্প দ্বারা ভল্টের মতো একটি কীস্টোর তৈরি এবং পরিচালনা করতে প্রয়োজনীয় যন্ত্রপাতিগুলির কারণে এখানে অসুবিধাটি অতিরিক্ত জটিলতা is

একা একা ডকার পাত্রে এসএসএইচ কী ব্যবহারের জন্য উপরে লিঙ্কিত পদ্ধতিগুলি দেখুন এবং আপনার নির্দিষ্ট প্রয়োজনের উপর নির্ভর করে প্রত্যেকের ত্রুটিগুলি বিবেচনা করুন। তবে, আপনি যদি কমপোজের অভ্যন্তরে ছুটে চলেছেন এবং রানটাইমের সময় কোনও অ্যাপের চাবি ভাগ করতে চান (ওপির ব্যবহারিকাগুলি প্রতিফলিত করে) এটি চেষ্টা করুন:

  • একটি docker-compose.envফাইল তৈরি করুন এবং এটি আপনার যুক্ত করুন.gitignore ফাইলে যুক্ত করুন।
  • আপনার আপডেট করুন docker-compose.ymlএবং যুক্ত করুনenv_file কীটির প্রয়োজনীয় পরিষেবার জন্য যুক্ত করুন।
  • অ্যাপ্লিকেশন রানটাইমের সময় পরিবেশ থেকে সর্বজনীন কী অ্যাক্সেস করুন, যেমন process.node.DEPLOYER_RSA_PUBKEYকোনও নোড.জেএস অ্যাপ্লিকেশনটির ক্ষেত্রে।

উপরোক্ত পদ্ধতির বিকাশ এবং পরীক্ষার জন্য আদর্শ এবং এটি উত্পাদন প্রয়োজনীয়তাগুলি পূরণ করতে পারে, উত্পাদন ক্ষেত্রে আপনি উপরে চিহ্নিত অন্যান্য পদ্ধতিগুলির মধ্যে একটি ব্যবহার করা ভাল।

অতিরিক্ত সম্পদ:


3

আপনি ধারকগুলি তৈরি করতে মাল্টি স্টেজ বিল্ড ব্যবহার করতে পারেন এটিই আপনি নিতে পারেন এমন পদ্ধতি:

মঞ্চ 1 ssh দিয়ে একটি চিত্র তৈরি করছে

FROM ubuntu as sshImage
LABEL stage=sshImage
ARG SSH_PRIVATE_KEY
WORKDIR /root/temp

RUN apt-get update && \
    apt-get install -y git npm 

RUN mkdir /root/.ssh/ &&\
    echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa &&\
    chmod 600 /root/.ssh/id_rsa &&\
    touch /root/.ssh/known_hosts &&\
    ssh-keyscan github.com >> /root/.ssh/known_hosts

COPY package*.json ./

RUN npm install

RUN cp -R node_modules prod_node_modules

দ্বিতীয় পর্যায়: আপনার ধারক তৈরি করুন

FROM node:10-alpine

RUN mkdir -p /usr/app

WORKDIR /usr/app

COPY ./ ./

COPY --from=sshImage /root/temp/prod_node_modules ./node_modules

EXPOSE 3006

CMD ["npm", "run", "dev"] 

আপনার রচনা ফাইলটিতে env বৈশিষ্ট্য যুক্ত করুন:

   environment:
      - SSH_PRIVATE_KEY=${SSH_PRIVATE_KEY}

তারপরে বিল্ড স্ক্রিপ্ট থেকে আরোগুলি পাস করুন:

docker-compose build --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"

এবং সুরক্ষার জন্য এটি মধ্যবর্তী পাত্রে সরান। এটি আপনাকে চিয়ার্সে সহায়তা করবে।


2

ডকার চিত্রের স্তরে আপনার কীটি সংরক্ষণ না করে বা ssh_agent জিমন্যাস্টিকের মধ্য দিয়ে না গিয়ে এটি অর্জনের একটি সহজ এবং সুরক্ষিত উপায় হ'ল:

  1. আপনার পদক্ষেপগুলির একটি হিসাবে Dockerfile, যুক্ত করে একটি .sshডিরেক্টরি তৈরি করুন :

    RUN mkdir -p /root/.ssh

  2. এর নীচে ইঙ্গিত দেয় যে আপনি ভলিউম হিসাবে ssh ডিরেক্টরিটি মাউন্ট করতে চান:

    VOLUME [ "/root/.ssh" ]

  3. নিশ্চিত করুন যে আপনার ssh_configধারকটি এই লাইনটি যুক্ত করে সর্বজনীন কীগুলি কোথায় সন্ধান করবেন:

    RUN echo " IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config

  4. .sshরানটাইমের সময় আপনার স্থানীয় ব্যবহারকারীর ডিরেক্টরিটি ধারকটিতে প্রকাশ করুন:

    docker run -v ~/.ssh:/root/.ssh -it image_name

    অথবা আপনার dockerCompose.ymlপরিষেবার মধ্যে ভলিউম কী এর অধীনে এটি যুক্ত করুন:

    - "~/.ssh:/root/.ssh"

আপনার ফাইনালে Dockerfileএমন কিছু থাকা উচিত:

FROM node:6.9.1

RUN mkdir -p /root/.ssh
RUN  echo "    IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config

VOLUME [ "/root/.ssh" ]

EXPOSE 3000

CMD [ "launch" ]

1

আমি সমস্যাটি অন্যভাবে কাজ করার চেষ্টা করছি: একটি ইমেজটিতে পাবলিক ssh কী যুক্ত করা। তবে আমার পরীক্ষায় আমি আবিষ্কার করেছি যে "ডকার সিপি" হোস্টের কাছে একটি ধারক থেকে কপি করার জন্য। ক্রিক দ্বারা উত্তরের আইটেম 3 বলে মনে হচ্ছে আপনি কোনও পাত্রে ফাইলগুলি ইনজেক্ট করতে ডকার সিপি ব্যবহার করতে পারেন। Https://docs.docker.com/engine/references/commandline/cp/ দেখুন

উদ্ধৃতাংশ

কোনও ধারকের ফাইল সিস্টেম থেকে হোস্টের পথে ফাইল / ফোল্ডারগুলি অনুলিপি করুন। পাথগুলি ফাইল সিস্টেমের মূলের সাথে সম্পর্কিত।

  Usage: docker cp CONTAINER:PATH HOSTPATH

  Copy files/folders from the PATH to the HOSTPATH

এই URL টি এখন নষ্ট হয়ে গেছে বলে মনে হচ্ছে।
slm

এটি অপ্রচলিত বা ভুল। সর্বশেষ 1.8.2 হিসাবে এটি কোনও দিকই অনুলিপি করতে পারে।
জোনাথন রেইনার্ট

1

আপনি একটি ভাগ করা ফোল্ডার ব্যবহার করে আপনার ধারকটিতে অনুমোদিত কীগুলি পাস করতে পারেন এবং এই জাতীয় ডকার ফাইল ব্যবহার করে অনুমতি সেট করতে পারেন:

FROM ubuntu:16.04
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
EXPOSE 22
RUN cp /root/auth/id_rsa.pub /root/.ssh/authorized_keys
RUN rm -f /root/auth
RUN chmod 700 /root/.ssh
RUN chmod 400 /root/.ssh/authorized_keys
RUN chown root. /root/.ssh/authorized_keys
CMD /usr/sbin/sshd -D

এবং আপনার ডকার রানটিতে কনটেইনারটির সাথে হোস্টে কোনও অথথি ডিরেক্টরি শেয়ার করার জন্য নীচের মতো কিছু রয়েছে (অথরাইজড_কিগুলি ধারণ করে) তারপরে ssh পোর্টটি খুলুন যা হোস্টের 1০০১ পোর্টের মাধ্যমে অ্যাক্সেসযোগ্য হবে।

-d -v /home/thatsme/dockerfiles/auth:/root/auth -–publish=127.0.0.1:7001:22

আপনি https://github.com/jpetazzo/nsenter দেখতে চাইতে পারেন যা ধারকটিতে শেল খোলার এবং ধারকটির মধ্যে আদেশগুলি কার্যকর করার অন্য উপায় বলে মনে হয়।


1

পার্টিতে দেরীতে স্বীকার করে নিন, কীভাবে এটি আপনার হোস্ট অপারেটিং সিস্টেমের কীগুলি কনটেইনারটির অভ্যন্তরে রুট করার জন্য, ফ্লাইতে উপলব্ধ করবে:

docker run -v ~/.ssh:/mnt -it my_image /bin/bash -c "ln -s /mnt /root/.ssh; ssh user@10.20.30.40"

আপনার ধারকটির পুনরাবৃত্তিগুলি ব্যক্তিগত কীগুলি পিছনে ছেড়ে দিতে পারে বলে আমি কীগুলি ইনস্টল করতে ডকফাইফিল ব্যবহারের পক্ষে নই।


0

কোনও সংবেদনশীল ডেটা পরিচালনা করার জন্য আপনি গোপনীয়তা ব্যবহার করতে পারেন যা রানটাইমের সময় একটি ধারক প্রয়োজন তবে আপনি ছবিতে বা উত্স নিয়ন্ত্রণে সঞ্চয় করতে চান না যেমন:

  • ব্যবহারকারীর নাম এবং পাসওয়ার্ড
  • টিএলএস শংসাপত্র এবং কীগুলি
  • এসএসএইচ কী
  • অন্যান্য গুরুত্বপূর্ণ ডেটা যেমন কোনও ডাটাবেস বা অভ্যন্তরীণ সার্ভারের নাম
  • জেনেরিক স্ট্রিং বা বাইনারি সামগ্রী (আকারে 500 কেবি পর্যন্ত)

https://docs.docker.com/engine/swarm/secrets/

আমি রানটাইমের সময় ব্যবহারের জন্য কোনও ধারকটিতে কীভাবে সাইন ইন কী যুক্ত করতে হবে তা নির্ধারণ করার চেষ্টা করছিলাম (বিল্ড নয়) এবং এই প্রশ্নটি এসেছিল। ডকার সিক্রেটগুলি আমার ব্যবহারের মামলার সমাধান বলে মনে হচ্ছে এবং যেহেতু কেউ এটি উল্লেখ করেনি আমি এখনও যুক্ত করব।


0

আমার ক্ষেত্রে নোডেজ এবং একটি রিমোট রিপোজিটরি থেকে 'এনপিএম আই' নিয়ে আমার সমস্যা ছিল। আমি ঠিক করেছি যে এটি নোডেজ কনটেইনারটিতে 'নোড' ব্যবহারকারী এবং ধারকটিতে 700 থেকে ~ / .ssh যুক্ত হয়েছে।

Dockerfile:

USER node #added the part
COPY run.sh /usr/local/bin/
CMD ["run.sh"]

run.sh:

#!/bin/bash
chmod 700 -R ~/.ssh/; #added the part

Docker-compose.yml:

nodejs:
      build: ./nodejs/10/
      container_name: nodejs
      restart: always
      ports:
        - "3000:3000"
      volumes:
        - ../www/:/var/www/html/:delegated
        - ./ssh:/home/node/.ssh #added the part
      links:
        - mailhog
      networks:
        - work-network

তারপরে এটি কাজ শুরু করে


-1

সহজ উপায়, একটি লঞ্চপ্যাড অ্যাকাউন্ট পান এবং ব্যবহার করুন: ssh-Import-id


8
প্রশ্নটি ছিল ব্যক্তিগত কী সম্পর্কে। ssh-import-idদেখে মনে হচ্ছে এটি কেবল সর্বজনীন কীগুলি আমদানি করে।
সিডিডিআর

-1

চলমান ডকার পাত্রে, আপনি ডকার -i (ইন্টারেক্টিভ) বিকল্পের সাথে এসএসএস-কীজেন জারি করতে পারেন। এটি কন্টেইনারটি ডকারের ধারকটির ভিতরে কী তৈরি করতে অনুরোধ জানাবে।


1
এবং তারপর কি? আপনি এর পরে আর কিছু করতে পারবেন না, কারণ আপনার এটি করার অনুমতি নেই।
জোনাথন রাইনহার্ট

-1

ডিবিয়ান / রুট / অনুমোদিত_ কিসের জন্য:

RUN set -x && apt-get install -y openssh-server

RUN mkdir /var/run/sshd
RUN mkdir -p /root/.ssh
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN  echo "ssh-rsa AAAA....yP3w== rsa-key-project01" >> /root/.ssh/authorized_keys
RUN chmod -R go= /root/.ssh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.