ডকার কমপোজ ব্যবহার করে ইন্টারেক্টিভ শেল


271

কেবল ডকার কম্পোজ ব্যবহার করে কোনও ধারকটিতে একটি ইন্টারেক্টিভ শেল শুরু করার কোনও উপায় আছে কি? আমি আমার ডকার-কম্পোজ.আইএমএলে এরকম কিছু চেষ্টা করেছি:

myapp:
  image: alpine:latest
  entrypoint: /bin/sh

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

আমি জানি যে এটি অর্জনের জন্য নেটিভ ডকার কমান্ড অপশন রয়েছে, কেবল কৌতূহলজনক যদি এটি কেবলমাত্র ডকার রচনাটিও ব্যবহার করা সম্ভব হয়।


এটি কাজ করার কথা নয়। উদাহরণস্বরূপ, /bin/shআপনার রচনা ফাইলটিতে এন্ট্রিপয়েন্ট সহ যদি আপনার একাধিক চিত্র থাকে তবে এটি কী করা উচিত?
জিওনগবিং জিন

2
হুঁ, কেন শুধু একাধিক শেল শুরু করবেন না? উদাহরণস্বরূপ, মাইএসকিএল ক্লায়ার সাথে কাজ করার জন্য একটি মাইএসকিএল কনটেইনারে একটি শেল এবং ব্যাকআপ কমান্ডগুলি চালানোর জন্য ব্যাকআপ ধারকটিতে একটি শেল?
drubb

1
কি docker-compose run myapp?
আইভোবা

1
@ আইবোভা সমস্যাটি হ'ল docker-compose run myappএটি বন্দরগুলি প্রকাশ করবে না। সুতরাং আপনাকে ব্যবহার করতে হবে docker-compose run --service-ports myappতবে এটি খুব সুবিধাজনক নয়।
মূর্খ

entrypoint: /bin/shহওয়া উচিতentrypoint: "/bin/sh"
codentary

উত্তর:


341

আপনার ডকার-কমপোজ.আইএমএলে আপনাকে নিম্নলিখিত লাইনগুলি অন্তর্ভুক্ত করতে হবে:

version: "3"
services:
  app:
    image: app:1.2.3
    stdin_open: true # docker run -i
    tty: true        # docker run -t

প্রথম অনুরূপ -iমধ্যে docker runএবং দ্বিতীয় -t


3
এটি stdin_openআমার অনুপস্থিত আচরণের জন্য অনুপস্থিত লিঙ্কটি, যখন আমি আমার কোনও পাত্রে ইতিমধ্যে শেল চালাচ্ছি তার সাথে সংযুক্ত করি।
চার্নি কায়ে

9
@ দফুল, এমনকি আমিও একই সমস্যা পেয়েছি। এটি চালানো আরও ভালdocker-compose run <service_name>
আসওয়াত কে

4
এটি ঠিক কোথায় যুক্ত করা হয়? ভিতরে কি সেবা?
সমস্যাসংখ্যক

এটি ওপি-র প্রশ্নের সেরা উত্তর বলে মনে হচ্ছে .. যেহেতু সমস্যাটি হ'ল কনটেইনারটি তত্ক্ষণাত্ প্রস্থান করে, সুতরাং docker execএটির সাহায্যে শেল পাওয়া কাজ করবে না।
রায়এম

এটি আমাকে উইন্ডোজে একটি ত্রুটি দেয়:colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
কুরলিনেটর

210

ডকার-কমপোজ সহ একটি ইন্টারেক্টিভ শেল পাওয়ার ক্যানোনিকাল উপায়টি হ'ল: docker-compose run --rm myapp

আপনি সেট করতে পারেন stdin_open: true, tty: true, তবে এটি আসলে আপনাকে সঠিক শেল দেবে না up, কারণ সমস্ত পাত্রে লগগুলি প্রবাহিত হচ্ছে।

আপনি ব্যবহার করতে পারেন

docker exec -ti <container name> /bin/bash

একটি চলমান পাত্রে শেল পেতে।


16
মনে রাখবেন --service-portsযে আপনি কোনও বন্দর উন্মুক্ত করলে (যেমন কোনও ওয়েব সার্ভারের জন্য) আপনাকে যুক্ত করতে হবে
Epelc

9
আমি আরও তথ্য সরবরাহ করতে এবং --rmপতাকা যুক্ত করার জন্য আমার উত্তর আপডেট করেছি যাতে ধারকটি সরানো হয়। @ Lynx0123 এর উত্তর সঠিক নয়। আপনি চালনা করলে আপনি একটি ইন্টারেক্টিভ শেল পাবেন না docker-compose up
dnephin

2
এটি উইন্ডোজের জন্য ডকার ব্যবহার করে কাজ করার জন্য, আমার ডকর-রচনা বনাম 1.9.0 দরকার (গিথুব ইস্যু এবং জনসংযোগ দেখুন )। 12/19/16 হিসাবে, এটি কেবল উইন্ডোজের জন্য ডকারের বিটা সংস্করণ সহ প্রেরণ করে। তারপরে docker-compose runকাজ করে। আপনি command: /bin/bashডকার-কমপোজ.আইএমএল যুক্ত করতে চাইবেন।
জোসেফ 238

5
এটি শীর্ষ উত্তর হওয়া উচিত। আমি এখানে আসার সময় এটিই খুঁজছিলাম।
mkasberg

8
ডকার-কমপোজ আপ-ডি && ডকার <কন্টেইনার_নাম> সংযুক্ত করুন
অ্যারন ম্যাকমিলিন

58

অফিসিয়াল সূচনা করার জন্য উদাহরণের সাথে ( https://docs.docker.com/compose/gettingst সূত্র / ) নীচের সাথে docker-compose.yml:

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

আপনি এটি দিয়ে শুরু করার পরে docker-compose up, আপনি সহজেই আপনার redisধারক বা আপনার webধারকটির সাথে শেল করতে পারেন :

docker-compose exec redis sh
docker-compose exec web sh 

44

docker-compose run myapp sh চুক্তি করা উচিত।

up/ এর সাথে কিছু বিভ্রান্তি রয়েছে runতবে docker-compose runডক্সের দুর্দান্ত ব্যাখ্যা রয়েছে: https://docs.docker.com/compose/references/run


1
তোমাকে অনেক ধন্যবাদ. স্পষ্ট করে কিছুটা যোগ করুন। ডকার-কম্পোজ রান [আপনার-পরিষেবা-নাম-সংজ্ঞায়িত-ইন-ডকার-কমপোজ.আইএমএল] [শ বা বাশ]।
thyranitp

23

ডকার-রচনাটি ব্যবহার করে, আমি এটি করার সবচেয়ে সহজ উপায়টি হ'ল একটি docker ps -a(আমার পাত্রে দিয়ে শুরু করার পরে docker-compose up) করা এবং যে ধারকটির একটি ইন্টারেক্টিভ শেল রাখতে চান তার আইডি পেতে (আসুন একে xyz123 কল করুন)।

তারপরে এটি কার্যকর করা সহজ বিষয় docker exec -ti xyz123 /bin/bash

এবং voila, একটি ইন্টারেক্টিভ শেল।


1
কেন এটিকে নিচে ভোট দেওয়া হয়েছে তা নিশ্চিত নন - কোনও কিছু ভুল হয়ে গেলে ডিবাগিংয়ের পক্ষে এটি একটি দুর্দান্ত উপায় and এবং সমাধানটি পড়ার এক মিনিটের মধ্যে আমি এই পদ্ধতিটি সাফল্যের সাথে ব্যবহার করেছি।
ericmjl

4
@ অ্যারিকিমজেল কারণ এটি একটি দুটি পদক্ষেপ প্রক্রিয়া যেখানে প্রশ্নটি ডকার-রচনা বৈশিষ্ট্যগুলি ব্যবহারের বিষয়ে বিশেষভাবে জিজ্ঞাসা করেছিল, এবং ইতিমধ্যে অন্য উত্তরে বলা হয়েছিল
ওয়ান ক্রিকেটার

19

ভবিষ্যতের কেউ যদি এখানেও ঘুরে বেড়ায়:

docker-compose exec container_name sh

অথবা

docker-compose exec container_name bash

অথবা আপনি মত একক লাইন চালাতে পারেন

docker-compose exec container_name php -v

এটি ইতিমধ্যে আপনার পাত্রে আপ এবং চলমান পরে


2

আপনি docker-compose exec SERVICE_NAME shকমান্ড লাইনে করতে পারেন । SERVICE_NAMEআপনার সংজ্ঞায়িত করা হয় docker-compose.yml। উদাহরণ স্বরূপ,

services:
    zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"

SERVICE_NAME"Zookeeper" হতে হবে।


2

এই প্রশ্নটি আমার জন্য অত্যন্ত আকর্ষণীয় কারণ আমার সমস্যা আছে, যখন আমি মৃত্যুদন্ড কার্যকর করার পরে ধারকটি চালাই সঙ্গে সঙ্গে প্রস্থান করি এবং আমি এইটি দিয়ে স্থির করেছিলাম:

docker run -it -p 3000:3000 -v /app/node_modules -v $(pwd):/app <your_container_id>

এবং যখন আমি এটি ডকার রচনা দিয়ে স্বয়ংক্রিয় করতে পারি:

version: '3'
services:
    frontend:
        stdin_open: true
        tty: true
        build: 
            context: .
            dockerfile: Dockerfile.dev
        ports: 
            - "3000:3000"
        volumes: 
            - /app/node_modules
            - .:/app

এটি কৌশলটি তৈরি করে: stdin_open: সত্য, tty: সত্য

এটি তৈরি-প্রতিক্রিয়া-অ্যাপ্লিকেশন সহ উত্পন্ন একটি প্রকল্প

ডকফাইফাইল.দেব এটি দেখে মনে হচ্ছে:

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . . 

CMD ["npm", "run", "start"]

আশা করি এই উদাহরণটি অন্যকে ডকার পাত্রে সম্মুখভাগ (উদাহরণস্বরূপ প্রতিক্রিয়া) চালাতে সহায়তা করবে।


0

যদি ymlডাকা হয় তবে docker-compose.ymlএটি একটি সাধারণ দিয়ে চালু করা যেতে পারে $ docker-compose up। টার্মিনালের সাথে সম্পর্কিত সংযুক্তিটি সহজেই হতে পারে (বিবেচনা করুন যে ymlকোনও পরিষেবাটি নির্দিষ্ট করেছে myservice):

$ docker-compose exec myservice sh

তবে আপনি যদি কোনও আলাদা ymlফাইলের নাম ব্যবহার করে থাকেন তবে docker-compose-mycompose.ymlএটি ব্যবহার করে চালু করা উচিত $ docker-compose -f docker-compose-mycompose.yml up। একটি ইন্টারেক্টিভ টার্মিনাল সংযুক্ত করতে আপনাকে ymlফাইলটিও নির্দিষ্ট করতে হবে যেমন:

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