[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
참고 : 이미지 및 CMD
Dockerfile에서 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