Docker Compose를 사용하는 대화식 쉘


271

Docker Compose 만 사용하여 컨테이너에서 대화식 쉘을 시작하는 방법이 있습니까? 내 docker-compose.yml에서 이와 같은 것을 시도했습니다.

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

docker-compose up을 사용 하여이 컨테이너를 시작하면 즉시 종료됩니다. 대화식 쉘로 시작하기 위해 진입 점 명령에 추가하거나 myapp에 대한 추가 옵션으로 추가 할 수있는 플래그가 있습니까?

이 작업을 수행하는 기본 docker 명령 옵션이 있다는 것을 알고 Docker Compose 만 사용할 수 있는지 궁금합니다.


이것은 작동하지 않아야합니다. 예를 들어, /bin/sh작성 파일에 시작점이있는 이미지가 여러 개인 경우 어떻게해야합니까?
Xiongbing Jin

2
흠, 왜 여러 쉘을 시작하지 않습니까? 예를 들어, mysql cli와 작업하기 위해 mysql 컨테이너에 쉘을, 백업 명령을 실행하기 위해 쉘을 백업 컨테이너에?
drubb

1
무엇에 대해 docker-compose run myapp?
ivoba

1
@ibova 문제는 docker-compose run myapp포트를 노출시키지 않는다는 것입니다. 따라서 사용해야 docker-compose run --service-ports myapp하지만 여전히 편리하지는 않습니다.
The Fool

entrypoint: /bin/sh해야entrypoint: "/bin/sh"
codentary

답변:


341

docker-compose.yml에 다음 줄을 포함해야합니다.

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

첫 번째는 -iin에 해당하고 두 번째는에 해당 docker run합니다 -t.


3
그것은 stdin_open이미 쉘을 실행중인 컨테이너 중 하나에 연결할 때 예상되는 동작을 제공하기 위해 누락 된 링크입니다.
Charney Kaye

9
@ TheFool, 심지어 같은 문제가 있습니다. 실행하는 것이 좋습니다docker-compose run <service_name>
Aswath K

4
정확히 어디에 추가됩니까? 서비스 내부?
problemofficer

이것은 OP의 질문에 대한 가장 좋은 대답 인 것 같습니다. 문제는 컨테이너가 즉시 즉시 종료되므로 쉘을 사용 docker exec하는 것이 효과가 없다는 것입니다.
RoyM

Windows에서 오류가 발생합니다.colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
cowlinator

210

docker-compose로 대화 형 셸을 얻는 정식 방법은 다음을 사용하는 것입니다. 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
Windows 용 Docker를 사용 하여이 기능을 사용하려면 docker-compose v. 1.9.0이 필요했습니다 (Github 문제PR 참조 ). 12/19/16 현재 Windows 용 Docker 베타 버전 만 제공됩니다. 그런 다음 docker-compose run작동합니다. command: /bin/bashdocker-compose.yml 에 추가하고 싶을 수도 있습니다 .
Joseph238

5
이것이 최고의 답변이어야합니다. 이것이 내가 여기 왔을 때 찾고 있던 것입니다.
mkasberg

8
docker-compose up -d && docker attach <container_name>
Aaron McMillin

58

공식 시작 예제 ( https://docs.docker.com/compose/gettingstarted/ )에서 다음과 같이 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/reference/run


1
정말 고맙습니다. 명확히하기 위해 조금만 추가하십시오. docker-compose run [your-service-name-defined-in-docker-compose.yml] [sh 또는 bash]를 실행하십시오.
theeranitp

23

docker-compose를 사용 하여이 작업을 수행하는 가장 쉬운 방법은 docker ps -a(로 컨테이너를 시작한 후 docker-compose up)하고 대화 형 셸을 사용하려는 컨테이너의 ID를 얻는 것입니다 (xyz123이라고 함).

그런 다음 실행하는 것이 간단합니다. docker exec -ti xyz123 /bin/bash

그리고 대화식 쉘인 voila.


1
이것이 다운 투표 된 이유를 모르겠습니다. 문제가 생길 경우 디버깅을 얻는 좋은 방법이며,이 솔루션을 읽은 순간 1 분 안에이 방법을 성공적으로 사용했습니다.
ericmjl

4
@ericmjl 2 단계 프로세스이기 때문에이 질문은 docker-compose 기능 사용에 대해 구체적으로 물어
보았

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"사육사"일 것이다.


2

실행이 끝난 후 컨테이너를 실행하면 즉시 종료하고 -it로 고정하면 문제가 있기 때문에이 질문은 나에게 매우 흥미 롭습니다.

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

그리고 docker compose로 자동화해야 할 때 :

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

이것은 트릭을 만듭니다 : stdin_open : true, tty : true

이것은 create-react-app로 생성 된 프로젝트입니다

Dockerfile.dev는 다음과 같습니다.

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.