Docker Compose는 컨테이너 실행 유지


94

docker-compose로 서비스를 시작하고 'docker inspect'를 통해 IP 주소를 얻을 수 있도록 컨테이너를 계속 실행하고 싶습니다. 그러나 컨테이너는 항상 시작 직후에 종료됩니다.

"command : ["sleep ","60 "]"등을 docker-compose.yml에 추가하려고했지만 "command : ..."줄을 추가 할 때마다 "docker-compose up"을 호출 할 수 없습니다. "컨테이너를 시작할 수 없습니다 ..... 시스템 오류 : 값의 시작을 찾는 잘못된 문자 'k'"라는 메시지가 표시됩니다.

또한 Dockerfile 자체에 "CMD sleep 60"을 추가하려고 시도했지만 이러한 명령이 실행되지 않는 것 같습니다.

컨테이너를 유지하거나 내 문제 중 하나를 수정하는 쉬운 방법이 있습니까?

편집 : 다음은 실행하려는 Compose 파일입니다.

version: '2'
services:
  my-test:
    image: ubuntu
    command: bash -c "while true; do echo hello; sleep 2; done"

OS X에서 docker-compose로 시작하면 잘 작동하지만 Ubuntu 16.04에서 동일하게 시도하면 위의 오류 메시지가 표시됩니다.

Dockerfile로 접근 방식을 시도하면 Dockerfile은 다음과 같습니다.

FROM ubuntu:latest
CMD ["sleep", "60"]

아무것도하지 않는 것 같습니다

편집 2 : 나 자신을 수정해야합니다. Dockerfile 및 docker-compose.yml의 동일한 문제인 것으로 밝혀졌습니다. Dockerfile에 "CMD ..."를 추가하거나 "command ..."를 추가 할 때마다 작성 파일, 잘못된 문자로 위의 오류가 발생합니다. 두 명령을 모두 제거하면 완벽하게 작동합니다.


1
docker-compose.yml, Dockerfile 및 디버깅하려는 스크립트를 포함하세요.
BMitch

답변:


118

로 시작할 때 컨테이너를 계속 실행하려면 docker-compose다음 명령을 사용하십시오.

command: tail -F anything

따라서 docker-compose.yml은

version: '2'
services:
  my-test:
    image: ubuntu
    command: tail -F anything

다음 명령을 사용하여 셸을 실행하여 컨테이너에 들어갈 수 있습니다.

docker exec -i -t composename_my-test_1 bash

컨테이너 앞에 붙는 composename이름은 어디에 있습니까 docker-compose?


1
컨테이너를 다 사용한 후 어떻게 중지합니까? Ctrl + C, Ctrl + Z 유형의 명령이 있습니까? 지금 당장 종료하려면 터미널을 닫아야합니다.
mac10688

컨테이너 내부에있는 경우 입력 exit하여 호스트 컴퓨터로 돌아갈 수 있습니다. 호스트에있는 경우 Docker ( docker stop composename_my-test_1) 또는 Docker Compose ( docker-compose stop)를 사용하여 컨테이너를 중지 할 수 있습니다 .
Nick Settje 2018 년

2
@ Alexis.Rolland 새로운 SO 질문을하고 좀 더 자세한 내용을 공유하고 싶다면 기꺼이 살펴 보겠습니다. 내 생각 엔 오류는 Docker 또는 호스트 운영 체제의 문제와 달리 컨테이너 중 하나의 내부와 관련이 있습니다.
Nick Settje

1
@ mac10688 연결된 컨테이너 세션에 프롬프트가없는 경우 ctrl-d를 사용하여 분리하십시오
Stark

5
/dev/nullanything꼬리 명령 심판 을 위해 더 좋을 것 입니다. stackoverflow.com/a/48732671/248616
Nam G VU

80

tty구성 옵션을 사용할 수 있습니다 .

version: '3'

services:
  app:
    image: node:8
    tty: true           # <-- This option

참고 : 이미지 및 CMDDockerfile에서 Dockerfile 을 사용하는 경우이 옵션이 작동하지 않습니다. 그러나 Dockerfile에서 entrypoint를 지우는 compose 파일 의 옵션을 사용할 수 있습니다 CMD.


7
이것은 작동하며 tail -f /dev/null. 이를 통해 Postgres 데이터베이스가 연결된 컨테이너 식 개발 환경을 docker-compose up실행하고 .NET을 사용하여 다른 터미널을 통해 셸을 실행할 수 docker exec있습니다.
Psiloc

1
현재는 잘 문서화되어 있지 않습니다. 이 같은 효과를 달성 할 공식 옵션이다 tail -f /dev/null또는 tail -f anything여기를 참조 : docs.docker.com/compose/compose-file
B01

2
@ABMRuman & Psiloc, docker-compose.yml 파일에서 "command"를 사용하지 않을 때만 작동합니다. "명령"을 사용할 때 다른 해킹이 필요합니다. 따라서 꼬리 -F 해킹이 여기에 완벽하게 적합합니다.
asafel

dockerfile에서 진입 점을 사용하는 경우 이것이 최선의 대답이어야합니다.
DDKV587

53

를 기반으로 GitHub의 2015년 8월 26일에 @aanand의 코멘트 , 하나는 사용할 수 tail -f /dev/null컨테이너 실행을 유지하기 위해 고정 표시기-작성에.

docker-compose.yml 예제

version: '3'
services:
  some-app:
    command: tail -f /dev/null

왜이 명령입니까?

이 옵션을 선택한 유일한 이유는 GitHub에서 많은 좋아요를 받았기 때문입니다. 그러나 가장 많이 득표 한 답변이 최고의 답변이라는 의미는 아닙니다. 두 번째 이유는 마감일로 인해 가능한 한 빨리 문제를 해결해야하는 실용적인 이유였습니다.


2
왜 정확히이 명령입니까? 다른 사람보다 더 나은 이유는 무엇입니까? 제 경우에는 그냥 트릭은 ...뿐만 아니라 떠들썩한 파티를 않았다 시작
N4ppeL

@ N4ppeL 좋은 질문입니다. 내가이 옵션을 선택한 유일한 이유는 github에서 많은 좋아요를 받았기 때문입니다. 그러나 가장 많이 득표 한 답변이 그것이 최고의 답변이라는 것을 의미하지는 않습니다. 두 번째 이유는 마감일로 인해 가능한 한 빨리 문제를 해결해야했기 때문에 실용적인 이유였습니다.
030

17
  • 라는 파일을 만듭니다. docker-compose.yml
  • 파일에 다음을 추가하십시오.
version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    tty: true
  • 동일한 디렉토리에 머물 docker-compose up -d면서 터미널에서 실행
  • docker ps컨테이너 ID 또는 이름을 얻으려면 실행하십시오.
  • 당신은 실행할 수 있습니다 docker inspect $container_id
  • 컨테이너에 들어가서 bash 셸을 실행 docker-compose exec ubuntu /bin/bash하거나docker-compose exec ubuntu /bin/sh
  • 완료되면 컨테이너 외부에 있는지 확인하고 docker-compose down

다음 my-docker-shell.sh은 docker compose 파일을 만들고 컨테이너를 실행하고 컨테이너에 로그인 한 다음 로그 아웃 할 때 마지막으로 docker 컨테이너와 docker compose 파일을 정리 하는 작은 bash 스크립트 ( )입니다.

#!/bin/bash

cat << 'EOF' > ./docker-compose.yml
---

version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    command: /bin/bash
    # tty: true

...
EOF

printf "Now entering the container...\n"
docker-compose run ubuntu bash
docker-compose down

rm -v ./docker-compose.yml

1
이 질문에 대한 실제 답변은 아니지만 매우 가치가 있다는 것을 알았습니다! 이 접근 방식을 위해 글로벌 bashrc 함수를 사용하기 위해 더 나아갔습니다. gist.github.com/loopmode/4d59a4e9a0a2ffacaec2dd14db4ae8bd
loopmode

8

Dockerfile에서 다음 명령을 사용할 수 있습니다.

{CMD sleep infinity}

2

댓글 작성자가 말했듯이 완전한 답변을 제공하려면 문제의 Dockerfile을 확인해야하지만 이것은 매우 일반적인 실수입니다. 실행하려는 명령이 백그라운드 프로세스를 시작한다는 것을 거의 보장 할 수 있습니다. 이것은 Docker가 아닌 상황에서 실행하는 명령 일 수 있지만 Dockerfile에서 수행하는 것은 잘못된 것입니다. 예를 들어 실행중인 항목이 일반적으로 시스템 서비스로 정의 된 경우 "systemctl start"와 같은 것을 사용할 수 있습니다. 그러면 백그라운드에서 프로세스가 시작되지만 작동하지 않습니다. 프로세스를 포 그라운드에서 실행해야하므로 전체 프로세스가 차단됩니다.


0

간단한 메모

을 기반으로 단일 이미지를 테스트 golang했으므로 docker-compose down여기를 호출하면 다음과 같은 결과가 나타납니다 .

version: "3.1"
...
command: tail -f /dev/null   # stopping container takes about 10 sec.
tty: true                    # stopping container takes about 2 sec.

내 시스템 정보 :

Ubuntu 18.04.4 LTS (64-bit)
Docker version 19.03.6, build 369ce74a3c
docker-compose version 1.26.0, build d4451659

-3

네 실수를 찾았습니다. 작성에 사용 된 이미지의 Dockerfile에서 기본 이미지가 ubuntu : latest 여야한다고 지정했지만 이전에 직접 ubuntu라는 이미지를 만들었는데 해당 이미지가 작동하지 않았습니다. 그래서 나는 원래 우분투 이미지를 사용하지 않고 오히려 우분투라고도 불리는 내 자신의 이미지의 손상된 버전을 사용했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.