[docker] Docker Compose는 컨테이너 실행 유지

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 …”를 추가 할 때마다 작성 파일, 잘못된 문자로 위의 오류가 발생합니다. 두 명령을 모두 제거하면 완벽하게 작동합니다.



답변

로 시작할 때 컨테이너를 계속 실행하려면 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?


답변

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

version: '3'

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

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


답변

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

docker-compose.yml 예제

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

왜이 명령입니까?

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


답변

  • 라는 파일을 만듭니다. 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


답변

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

{CMD sleep infinity}


답변

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


답변

간단한 메모

을 기반으로 단일 이미지를 테스트 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