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.
/bin/sh
punktem wejścia w pliku tworzenia, co należy zrobić?docker-compose run myapp
?docker-compose run myapp
tym, że nie ujawnia portów. Musisz więc używać,docker-compose run --service-ports myapp
ale nadal nie jest to zbyt wygodne.entrypoint: /bin/sh
powinien byćentrypoint: "/bin/sh"
Odpowiedzi:
Musisz dołączyć następujące wiersze do docker-compose.yml:
Pierwszy odpowiada
-i
in,docker run
a drugi --t
.źródło
stdin_open
jest 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ę.docker-compose run <service_name>
docker exec
na nim nie zadziała.colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
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ć
aby uzyskać powłokę na działającym kontenerze.
źródło
--service-ports
jeśli--rm
flagę, aby usunąć pojemnik. Odpowiedź @ lynx0123 jest nieprawidłowa. Po uruchomieniu nie otrzymasz interaktywnej powłokidocker-compose up
.docker-compose run
działa. Będziesz także chciał dodaćcommand: /bin/bash
do docker-compose.yml.W oficjalnym przykładzie rozpoczęcia ( https://docs.docker.com/compose/gettingstarted/ ) z następującymi informacjami
docker-compose.yml
:Po uruchomieniu możesz z
docker-compose up
łatwością wykonać pocisk wredis
kontenerze lubweb
kontenerze za pomocą:źródło
docker-compose run myapp sh
powinien załatwić sprawę.Jest trochę pomyłek z
up
/run
, aledocker-compose run
dokumenty mają świetne wytłumaczenie: https://docs.docker.com/compose/reference/runźródło
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.
źródło
Jeśli ktoś z przyszłości również tu wędruje:
lub
lub możesz uruchomić pojedyncze linie jak
Oznacza to, że po uruchomieniu kontenerów już działa
źródło
Możesz to zrobić
docker-compose exec SERVICE_NAME sh
w wierszu poleceń.SERVICE_NAME
Jest zdefiniowana na liściedocker-compose.yml
. Na przykład,SERVICE_NAME
Byłoby „Heca w zoo”.źródło
To pytanie jest dla mnie bardzo interesujące, ponieważ mam problemy, kiedy uruchamiam kontener po zakończeniu wykonywania, natychmiast wychodzę i naprawiłem -it:
A kiedy muszę to zautomatyzować za pomocą komponentu dokującego:
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:
Mam nadzieję, że ten przykład pomoże innym uruchomić frontend (na przykład zareagować) w kontenerze dokera.
źródło
Jeśli
yml
nazywa 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ę, żeyml
określił on usługę o nazwiemyservice
):Jeśli jednak używasz innej
yml
nazwy pliku, npdocker-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ćyml
plik, podobnie jak:źródło