Docker Compose kullanarak etkileşimli kabuk


271

Yalnızca Docker Compose kullanarak bir kapta etkileşimli bir kabuk başlatmanın herhangi bir yolu var mı? Docker-compose.yml'de böyle bir şey denedim:

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

Docker-compose up kullanarak bu kapsayıcıyı başlattığımda hemen çıkılıyor. Etkileşimli kabuk olarak başlamak için giriş noktası komutuna ekleyebileceğim herhangi bir bayrak veya myapp olarak ek bir seçenek var mı?

Bunu başarmak için yerel docker komut seçenekleri olduğunu biliyorum, sadece Docker Compose kullanarak da mümkün olup olmadığını merak ediyorum.


Bu işe yaramıyor. Örneğin, /bin/sholuşturma dosyanızda giriş noktası olan birden fazla resminiz varsa ne yapmalı?
Xiongbing Jin

2
Hmh, neden sadece birden fazla mermi başlatmıyorsun? Örneğin, mysql cli ile çalışmak için bir mysql kabına bir kabuk ve yedekleme komutlarını çalıştırmak için bir yedekleme kabına bir kabuk?
17'de drubb

1
Ne hakkında docker-compose run myapp?
ivoba

1
@ibova Sorun şu docker-compose run myappki portları açığa çıkarmayacak. Yani kullanmak zorunda docker-compose run --service-ports myappama yine de çok uygun değil.
Aptal

entrypoint: /bin/sholmalıentrypoint: "/bin/sh"
codentary

Yanıtlar:


342

Docker-compose.yml dosyasına aşağıdaki satırları eklemeniz gerekir:

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

İlk karşılık -iolarak docker runve ikinci -t.


3
O stdin_openzaten bir kabuk çalışan benim konteynerlerin birine bağlanmaya zaman basitçe bana beklenen davranış sağlamak için kayıp halka vardır.
Charney Kaye

9
@TheFool, Ben bile aynı sorunu var. Koşmak daha iyidocker-compose run <service_name>
Aswath K

4
Bu tam olarak nereye eklenir? Hizmetin içinde mi?
Sorunlu memur

Bu OP sorusuna en iyi cevap gibi görünüyor .. çünkü konu konteyner aksi takdirde hemen çıkar, bu yüzden docker execüzerinde kullanarak bir kabuk almak işe yaramaz.
RoyM

Bu bana Windows'da bir hata veriyor:colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
cowlinator

210

Docker-compose ile etkileşimli bir kabuk elde etmenin standart yolu şunları kullanmaktır: docker-compose run --rm myapp

stdin_open: true, tty: trueAncak, upgünlükleri tüm kaplardan akışa aldığınız için, aslında size uygun bir kabuk vermeyeceğinizi ayarlayabilirsiniz .

Ayrıca kullanabilirsiniz

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

çalışan bir konteyner üzerinde bir kabuk almak için.


16
--service-portsHerhangi bir bağlantı noktasını (örneğin bir web sunucusu için) açığa çıkarırsanız eklemeniz gerektiğini unutmayın
epelc

9
Daha fazla bilgi sağlamak ve --rmkapsayıcı kaldırılması için bayrağı eklemek için cevabımı güncelledim . @ Lynx0123'ün yanıtı doğru değil. Eğer koşarsanız interaktif bir kabuk elde edemezsiniz docker-compose up.
dnephin

2
Bunun Docker for Windows kullanarak çalışmasını sağlamak için docker-compose v. 1.9.0'a ihtiyacım vardı (bkz. Github sorunu ve PR ). 19.12.2016 itibariyle, bu yalnızca Windows için Docker'ın beta sürümleriyle birlikte gelir. Sonra docker-compose runçalışır. Ayrıca command: /bin/bashdocker-compose.yml dosyasına eklemek isteyeceksiniz.
Joseph238

5
Bu en iyi cevap olmalı. Buraya geldiğimde aradığım şey buydu.
mkasberg

8
docker-compose up -d && docker
eklentisi

58

Resmi başlangıç ​​örneğinde ( https://docs.docker.com/compose/gettingstarted/ ) aşağıdakilerle birlikte docker-compose.yml:

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

Buna ile başladıktan sonra docker-compose up, rediskabınıza veya kabınıza kolayca aşağıdakileri koyabilirsiniz web:

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

44

docker-compose run myapp sh anlaşmayı yapmalı.

up/ İle ilgili bazı karışıklıklar var run, ancak docker-compose rundokümanların harika bir açıklaması var: https://docs.docker.com/compose/reference/run


1
Çok teşekkür ederim. Açıklığa kavuşturmak için biraz ekleyin. docker-compose [do-comp-in-in-service-name-in-docker-compose.yml] [sh veya bash] komutunu çalıştırın.
theeranitp

23

Docker-compose kullanarak, bunu yapmanın en kolay yolunu (kaplarımı docker ps -abaşlattıktan sonra docker-compose up) yapmak ve etkileşimli bir kabuğa sahip olmak istediğim kabın kimliğini almak (xyz123 diyelim) bulmaktır.

O zaman yürütmek basit bir mesele docker exec -ti xyz123 /bin/bash

ve etkileşimli bir kabuk olan voila.


1
Bunun neden aşağı oy verildiğinden emin değilim - bir şeylerin yanlış gitmesi durumunda hata ayıklamanın harika bir yolu ve bu yöntemi okuduktan sonra bir dakika içinde başarılı bir şekilde kullandım.
ericmjl

4
@ericmjl Çünkü sorunun özellikle docker-compose özelliklerinin kullanımı hakkında sorulduğu ve diğer cevapta daha önce belirtildiği
OneCricketeer

19

Gelecekten herhangi biri de burada dolaşırsa:

docker-compose exec container_name sh

veya

docker-compose exec container_name bash

veya aşağıdaki gibi tek satırlar çalıştırabilirsiniz

docker-compose exec container_name php -v

Bu, konteynırlarınızı zaten çalıştırdıktan sonra


2

Yapabileceğin docker-compose exec SERVICE_NAME shkomut satırında. SERVICE_NAMEGözlerinde farklı tanımlanır docker-compose.yml. Örneğin,

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

SERVICE_NAME"Görevli" olurdu.


2

Bu soru benim için çok ilginç çünkü yürütme hemen bittikten sonra kapsayıcı çalıştırdığımda ve -it ile sabitlediğimde problemlerim var:

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

Ve ne zaman docker compose ile otomatikleştirmek gerekir:

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

Bu hile yapar: stdin_open: true, tty: true

Bu, create-tepki uygulaması ile oluşturulan bir projedir

Dockerfile.dev şöyle görünüyor:

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . . 

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

Umarım bu örnek, diğerlerinin liman işçisi konteynırına bir ön uç (örneğin tepki) vermesine yardımcı olur.


0

Eğer ymldenir docker-compose.ymlbir basit ile başlatılabilir $ docker-compose up. Bir terminalin karşılık gelen eki basitçe olabilir ( ymlbir servisin belirtilen hizmeti belirttiğini düşünün myservice):

$ docker-compose exec myservice sh

Ancak, farklı bir ymldosya adı kullanıyorsanız, bu dosya docker-compose-mycompose.ymlkullanılarak başlatılmalıdır $ docker-compose -f docker-compose-mycompose.yml up. Etkileşimli bir terminal eklemek için ymldosyayı da belirtmeniz gerekir , örneğin:

$ docker-compose -f docker-compose-mycompose.yml exec myservice sh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.