Interaktywna powłoka przy użyciu Docker Compose

271

Czy jest jakiś sposób, aby uruchomić interaktywną powłokę w kontenerze, używając tylko Docker Compose? Próbowałem czegoś takiego, w moim docker-compose.yml:

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

Kiedy uruchamiam ten kontener za pomocą kompilatora dokującego, jest on natychmiast kończony. Czy są jakieś flagi, które mogę dodać do polecenia punktu wejścia lub jako i dodatkową opcję do mojej aplikacji, aby uruchomić jako interaktywną powłokę?

Wiem, że istnieją natywne opcje poleceń dokera, aby to osiągnąć, po prostu ciekawi mnie, czy jest to możliwe przy użyciu tylko Docker Compose.

drubb
źródło
To nie powinno działać. Na przykład, jeśli masz wiele obrazów z /bin/shpunktem wejścia w pliku tworzenia, co należy zrobić?
Xiongbing Jin
2
Hm, dlaczego nie uruchomić wielu powłok? Na przykład, powłoka do kontenera mysql do pracy z mysql cli, a powłoka do kontenera kopii zapasowej do uruchamiania poleceń tworzenia kopii zapasowej?
drubb
1
co docker-compose run myapp?
ivoba
1
@ibova Problem polega na docker-compose run myapptym, że nie ujawnia portów. Musisz więc używać, docker-compose run --service-ports myappale nadal nie jest to zbyt wygodne.
Głupiec
entrypoint: /bin/shpowinien byćentrypoint: "/bin/sh"
współodpowiedzialny

Odpowiedzi:

341

Musisz dołączyć następujące wiersze do docker-compose.yml:

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

Pierwszy odpowiada -iin, docker runa drugi - -t.

Leon Carlo Valencia
źródło
3
że stdin_openjest to brakujące ogniwo, dla mnie po prostu zapewnienie oczekiwanego zachowania, kiedy dołączyć do jednej z moich kontenerów, który jest już uruchomiony powłokę.
Charney Kaye,
9
@ TheFool, Nawet ja mam ten sam problem. Lepiej biegaćdocker-compose run <service_name>
Aswath K
4
Gdzie dokładnie to jest dodane? Wewnątrz usługi?
problemofficer
To wydaje się być najlepszą odpowiedzią na pytanie PO. Ponieważ problem polega na tym, że kontener natychmiast wychodzi inaczej, więc uzyskanie powłoki docker execna nim nie zadziała.
RoyM
To daje mi błąd w systemie Windows:colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
cowlinator
210

Kanonicznym sposobem uzyskania interaktywnej powłoki za pomocą narzędzia dokującego-komponowania jest użycie: docker-compose run --rm myapp

Możesz ustawić stdin_open: true, tty: true, jednak tak naprawdę nie da ci to właściwej powłokiup , ponieważ logi są przesyłane strumieniowo ze wszystkich kontenerów.

Możesz także użyć

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

aby uzyskać powłokę na działającym kontenerze.

dnephin
źródło
16
Pamiętaj, że musisz dodać, --service-portsjeśli
ujawniasz
9
Zaktualizowałem swoją odpowiedź, aby podać więcej informacji i dodać --rmflagę, aby usunąć pojemnik. Odpowiedź @ lynx0123 jest nieprawidłowa. Po uruchomieniu nie otrzymasz interaktywnej powłoki docker-compose up.
dnephin
2
Aby uzyskać to do pracy za pomocą Döcker dla Windows, potrzebowałem Döcker-komponować v. 1.9.0 (patrz GitHub problem i PR ). Od 19.12.2016 r. Jest to dostarczane tylko z wersją beta Docker na Windows. Potem docker-compose rundziała. Będziesz także chciał dodać command: /bin/bashdo docker-compose.yml.
Joseph238,
5
To powinna być najlepsza odpowiedź. Właśnie tego szukałem, kiedy tu przybyłem.
mkasberg
8
docker-compose up -d && docker attach <nazwa_kontenera>
Aaron McMillin
58

W oficjalnym przykładzie rozpoczęcia ( https://docs.docker.com/compose/gettingstarted/ ) z następującymi informacjami docker-compose.yml:

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

Po uruchomieniu możesz z docker-compose upłatwością wykonać pocisk w rediskontenerze lub webkontenerze za pomocą:

docker-compose exec redis sh
docker-compose exec web sh 
glina
źródło
44

docker-compose run myapp sh powinien załatwić sprawę.

Jest trochę pomyłek z up/ run, ale docker-compose rundokumenty mają świetne wytłumaczenie: https://docs.docker.com/compose/reference/run

Alex Povar
źródło
1
Dziękuję bardzo. Wystarczy dodać trochę, aby wyjaśnić. docker-compose uruchom [nazwa-usługi-zdefiniowanej-w-docker-compose.yml] [sh lub bash].
theeranitp,
23

Używając docker-compose, znalazłem najłatwiejszy sposób na zrobienie tego docker ps -a(po uruchomieniu moich kontenerówdocker-compose up ) i uzyskać identyfikator kontenera, w którym chcę mieć interaktywną powłokę (nazwijmy to xyz123).

To jest prosta sprawa do wykonania docker exec -ti xyz123 /bin/bash

i voila, interaktywna powłoka.

David Hersey
źródło
1
Nie jestem pewien, dlaczego zostało to odrzucone - to świetny sposób na debugowanie w przypadku, gdy coś pójdzie nie tak, i zastosowałem tę metodę z powodzeniem, na przykład w ciągu minuty od przeczytania tego rozwiązania.
ericmjl,
4
@ericmjl Ponieważ jest to dwuetapowy proces, w którym pytanie zadano konkretnie o korzystaniu z funkcji dokowania-komponowania i zostało już określone w innej odpowiedzi
OneCricketeer
19

Jeśli ktoś z przyszłości również tu wędruje:

docker-compose exec container_name sh

lub

docker-compose exec container_name bash

lub możesz uruchomić pojedyncze linie jak

docker-compose exec container_name php -v

Oznacza to, że po uruchomieniu kontenerów już działa

Eleonora Iwanowa
źródło
2

Możesz to zrobić docker-compose exec SERVICE_NAME shw wierszu poleceń. SERVICE_NAMEJest zdefiniowana na liście docker-compose.yml. Na przykład,

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

SERVICE_NAMEByłoby „Heca w zoo”.

Yu N.
źródło
2

To pytanie jest dla mnie bardzo interesujące, ponieważ mam problemy, kiedy uruchamiam kontener po zakończeniu wykonywania, natychmiast wychodzę i naprawiłem -it:

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

A kiedy muszę to zautomatyzować za pomocą komponentu dokującego:

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

To sprawia, że ​​podstęp: stdin_open: true, tty: true

Jest to projekt wygenerowany za pomocą aplikacji create-reag-app

Dockerfile.dev wygląda to tak, że:

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . . 

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

Mam nadzieję, że ten przykład pomoże innym uruchomić frontend (na przykład zareagować) w kontenerze dokera.

Carnaru Valentin
źródło
0

Jeśli ymlnazywa się docker-compose.yml, można go uruchomić za pomocą prostego $ docker-compose up. Odpowiedni załącznik terminala może być po prostu (należy wziąć pod uwagę, że ymlokreślił on usługę o nazwie myservice):

$ docker-compose exec myservice sh

Jeśli jednak używasz innej ymlnazwy pliku, np docker-compose-mycompose.yml. Należy ją uruchomić przy użyciu $ docker-compose -f docker-compose-mycompose.yml up. Aby dołączyć terminal interaktywny, musisz również określić ymlplik, podobnie jak:

$ docker-compose -f docker-compose-mycompose.yml exec myservice sh
Cleber Jorge Amaral
źródło