"docker run -d" 후 도커 컨테이너가 자동으로 중지됩니다.
"에"를 사용합니다.docker run -d
에서 실행됩니다." 라고 말합니다.이런 모습입니다. 컨테이너 ID가 이미 있는 것을 확인할 수 있습니다.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
하지만 내가 docker ps
뛰어도 아무 것도 돌아오지 않았습니다.
그래서 ",docker ps -a
컨테이너가 이미 빠져나간 것을 볼 수 있습니다.
root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz
내가 잘못한게 있습니까?이 문제를 해결하려면 어떻게 해야 합니까?
centos docker 파일에 기본 명령이 있습니다.bash
.
때(, )-d
), 은 즉시 .), 은 됩니다 됩니다 은 .
업데이트 2017
최신 버전의 도커는 분리 모드와 포그라운드 모드 모두에서 컨테이너 실행을 허가합니다.-t
,-i
아니면-it
)
이 경우 추가 명령이 필요 없으며 이로써 충분합니다.
docker run -t -d centos
배시는 뒷전에서 기다리겠습니다.
그것은 처음에 칼랴니 차우다리의 답변에서 보고되었고 저지 빈의 답변에서 자세히 보고되었습니다.
vonc@voncvb:~$ d ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a50fd9e9189 centos "/bin/bash" 8 seconds ago Up 2 seconds wonderful_wright
산악지대의 경우 마리노스 안은 댓글로 다음과 같이 보고합니다.
docker run -t -d alpine/git
프로세스를 계속 유지하지 않습니다.
할 일:야할일일:할d야:oo :docker run --entrypoint "/bin/sh" -it alpine/git
원답(2015)
이 기사에서 언급한 바와 같이:
대신
docker run -i -t image your-command
, 를 합니다.-d
명령 하나로 컨테이너를 실행할 수 있고 + +를 눌러 컨테이너 터미널을 분리할 필요가 없으므로 권장됩니다.그러나 에 문제가 있습니다.
-d
선택.명령이 포그라운드로 계속 실행되지 않는 한 컨테이너는 즉시 중지됩니다.
도커는 포그라운드에서 계속 실행하려면 명령어가 필요합니다.그렇지 않으면 응용프로그램이 중지되고 컨테이너가 종료되는 것으로 간주됩니다.문제는 일부 애플리케이션이 포그라운드로 실행되지 않는다는 점입니다.어떻게 하면 더 쉽게 만들 수 있을까요?
이 상황에서 추가할 수 있습니다.
tail -f /dev/null
이렇게 하면 메인 명령이 백그라운드에서 실행되어도 꼬리가 계속 포그라운드에서 실행되기 때문에 컨테이너가 중지되지 않습니다.
이렇게 하면 효과가 있습니다.
docker run -d centos tail -f /dev/null
또는 도커 파일에서:
ENTRYPOINT ["tail"]
CMD ["-f","/dev/null"]
A docker ps
센토스 컨테이너가 아직 작동 중인 걸 보여줄 겁니다
거기서 거기에 붙이거나 떼어낼 수 있습니다(또는docker exec
일부 명령).
엔트리 포인트를 재정의하면 도커 파일에 지정된 내용이 있으면 파일이 엉망이 됩니다.
systemd
특별히 관심이 있습니다.
/dev/null
또한 별로 설득력이 없어 보입니다. 본질적으로 시스템에 불필요한 시스템 호출을 쏟아 붓는 것입니다.
수면과 함께 하는 또 다른 해결책은 훨씬 나아 보입니다.
POSIX에서 고려되지 않은 GNU 코어유틸 확장에 의존합니다.
이 대답에 따르면, 추가하는 것은.-t
플래그는 백그라운드에서 실행될 때 컨테이너가 빠져나가지 못하도록 합니다.그러면 사용할 수 있습니다.docker exec -i -t <image> /bin/bash
포탄 프롬프트에 들어갈 겁니다
docker run -t -d <image> <command>
-t 옵션은 "사이비 TTY를 할당한다"는 도움말이 있지만 문서화가 잘 되어 있지 않은 것 같습니다.
배경
도커 컨테이너는 프로세스("명령" 또는 "진입 지점")를 실행하여 컨테이너를 활성화합니다.명령이 계속 실행되는 한 컨테이너는 계속 실행됩니다.
경우 명령어 ( ( /bin/bash
, on, 으로, on centos:latest
터미널에 연결되어 있지 않고 실행할 것이 없을 때 bash가 수행하는 것과 같이) 즉시 종료됩니다.
때 ( 으로 로 할 의 를 의 으로 할 )-d
프로세스를 예: :httpd
이 경우 httpd 데몬이 실행되는 한 컨테이너는 활성 상태로 유지됩니다.
컨테이너 내부에서 실행 중인 데몬 프로세스 없이 컨테이너를 활성화하려는 것으로 보입니다.이것은 다소 이상합니다.(컨테이너와 상호작용할 때까지 컨테이너는 유용한 작업을 수행하지 않기 때문입니다.docker exec
할 수 .), ① ② ③ ④ ⑤ ⑥ ⑦ 할 도 이 와 을 도
(컨테이너 안에서 bash 프롬프트를 받으라는 말씀이신가요?요!docker run -it centos:latest
)
해결책
은 를 하는 은 하는 입니다 로 입니다 하는 은 을 실행하는 것입니다.sleep infinity
∙ ∙ 데몬 하는 것과 같은 한 일을 하는 .이것은 데몬 모드에서 TTY를 할당하는 것과 같은 이상한 일을 하는 것에 의존하지 않습니다.사용하는 것과 같은 이상한 일을 하는 것에 의존하지만,sleep
당신의 주요 지휘관으로서
$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d651c7a9e0ad centos:latest "sleep infinity" 2 seconds ago Up 2 seconds nervous_visvesvaraya
얼터너티브 솔루션
한 바와 같이 cjsimon 와,-t
"sign-ttyoption "sign-tty"합니다.단,는어고기에로호할지이고도다당록면형와에고도지s이할y호tonnh당s면(ue는uttytrs다sy형tnh록og로(dn에기어or고h'ctstu-i
가 있을 어쨌든 이 방법도 효과가 있을 것입니다.
$ docker run -t -d centos:latest
100% 확실하지는 않습니다.-t
다른 이상한 상호작용을 일으킬 것입니다. 만약 그렇다면 아래에 댓글을 남겨주세요.
안녕 이 문제는 컨테이너에 실행 중인 어플리케이션이 없으면 도커 컨테이너가 종료되기 때문입니다.
-d
옵션은 deamon 모드에서 컨테이너를 실행하는 것입니다.
따라서 컨테이너를 지속적으로 실행하는 방법은 응용프로그램을 계속 실행할 수 있는 도커의 셸 파일을 가리킵니다.start.sh 파일로 시도해 볼 수 있습니다.
Eg: docker run -d centos sh /yourlocation/start.sh
이 start.sh 은 끝나지 않는 응용 프로그램을 가리켜야 합니다.
애플리케이션을 실행하지 않으려면 설치할 수 있습니다.monit
∙ ∙ ∙ 두 를 계속 이 되었는지 .이 두 사례가 당신의 컨테이너를 계속 가동시키는데 도움이 되었는지 알려주시기 바랍니다.
행운을 빌어요.
다음 중 하나를 사용하여 원하는 작업을 수행할 수 있습니다.
docker run -t -d <image-name>
아니면
docker run -i -d <image-name>
아니면
docker run -it -d <image-name>
다른 답변(예: tail -f /dev/null)에서 제시하는 명령 매개 변수는 완전히 선택 사항이며, 컨테이너를 백그라운드에서 실행 상태로 유지하는 데 필요하지 않습니다.
또한 Docker 설명서에 따르면 -i 및 -t 옵션을 결합하면 셸처럼 동작할 수 있습니다.
참조:
https://docs.docker.com/engine/reference/run/ #포그라운드
이 코드 조각을 실행합니다.ENTRYPOINT
파일에서:커서내::
while true
do
echo "Press [CTRL+C] to stop.."
sleep 1
done
빌드된 도커 이미지를 다음과 같이 실행합니다.
docker run -td <image name>
컨테이너 셸에 로그인합니다.
docker exec -it <container id> /bin/bash
다음과 같이 명령을 실행합니다.
docker run -t -d <image-name>
port를 지정하려면 다음과 같이 명령합니다.
docker run -t -d -p <port-no> <image-name>
다음 명령을 사용하여 실행 중인 컨테이너를 확인합니다.
docker ps
완료된 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δdocker run -di image
난 에.docker container ls
당신은 그것이 실행되는 것을 보게 될 것입니다.
도커는 포그라운드에서 계속 실행하려면 명령어가 필요합니다.그렇지 않으면 응용프로그램이 중지되고 컨테이너가 종료되는 것으로 간주됩니다.
따라서 도커 입력 스크립트가 다음과 같은 백그라운드 프로세스인 경우:
/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &
'&'은 나중에 트리거되는 다른 포그라운드 프로세스가 없을 경우 컨테이너를 정지 및 종료합니다.따라서 솔루션은 '&'을 제거하거나 다른 전경 CMD를 실행하는 것입니다.
tail -f server.log
Docker 파일 끝에 CMD를 사용하는 경우 마지막에 코드를 추가하는 것이 가능합니다.이것은 도커가 ubuntu나 bash를 사용할 수 있는 OS를 기반으로 하는 경우에만 작동합니다.
&& /bin/bash
간단히 Docker 파일의 끝은 다음과 같습니다.
...
CMD ls && ... && /bin/bash
따라서 도커 이미지를 실행한 후에 자동으로 실행되는 것이 있으면 작업이 완료되면 bash 터미널이 도커 내부에서 활성화됩니다.따라서 셸 명령을 입력할 수 있습니다.
저만 그런 것 같지만 CentOS 7.3.1611과 Docker 1.12.6에서는 안정적으로 작동하기 위해 @VonC & @Christopher Simon이 게시한 답변을 조합하여 사용해야 했습니다.이 전에 내가 한 어떤 작업도 컨테이너가 CMD를 성공적으로 실행한 후에 컨테이너가 빠져나가는 것을 막을 수 없었습니다.oracle-xe-11Gr2와 sshd를 시작합니다.
도커파일
...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null
그런 다음 -d -t 와 -i 를 추가하여 실행합니다.
docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611
벽에 머리를 부딪친 지 몇 시간이 지나서야 마침내
ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password:
debug1: Authentication succeeded (password).
어떤 이유로든 tail -f가 제거되거나 -t -d -i 옵션이 생략되면 CMD를 실행한 후 위의 내용이 종료됩니다.
저도 같은 문제가 있었습니다. 그저 다른 터미널을 열었을 뿐인데, 그것은 저에게 효과가 있었습니다.
컨테이너 생성:
docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557
시작 컨테이너:
docker start 52bbc9b30557
컨테이너를 계속 실행하기 위해 bash를 시작합니다.
docker exec -it 52bbc9b30557 bash
필요한 프로세스 시작:
docker exec -it 52bbc9b30557 /path_to_cool_your_app
대화형 모드로 도커를 실행하면 문제가 해결될 수 있습니다.
대화형 모드를 사용하거나 사용하지 않고 이미지를 실행하는 예는 다음과 같습니다.
chaitra@RSK-IND-BLR-L06:~~/dockers$ sudo docker run -d -t -i test_again1.0 b6b942a79b1243bada59db19cf52da8744542fa843c95354966a18
chaitra@RSK-IND-BLR-L06:~/dockers$ sudo dockerps
컨테이너 ID IMAGE 명령 생성 상태 포트 이름
chaitra@RSK-IND-BLR-L06:~~/dockers$ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5
chaitra@RSK-IND-BLR-L06:~/dockers$ sudo dockerps
컨테이너 ID IMAGE COMMAND CREATED STATUS PORT NAMES c3d6a9529fd7 test_again1.0 "bash" 2초 전 업1초 대박_haibt
간단히 다음을 사용할 수 있습니다.
docker container run -d -it <container name or id> /bin/bash
문제에 대한 빠른 답변:
다음 명령만 실행하면 됩니다.
docker run -d image_name sleep infinity
아래 이미지 참조:
가이란 입니까?sleep infinity
sleep 명령은 셸이 지정된 시간 동안 대기하게 하는 Unix 명령입니다.
sleep infinity
명령은 Docker에서 컨테이너를 무한정 실행할 때 사용합니다.Docker에서 컨테이너를 실행하면 컨테이너에서 지정한 명령을 실행한 다음 명령이 완료되면 종료됩니다.이된를속면도e을 사용하면 됩니다.sleep infinity
지휘.
저는 같은 질문이 있는 아래의 게시물에서 설명하였습니다.
"출구"를 사용한 후 도커 알파인 컨테이너를 보관하는 방법은?
인수순서사항
Jersey Beans 답변(세 가지 예시 모두)은 저에게 효과가 있었습니다.꽤 많은 시행착오 끝에 저는 논쟁의 순서가 중요하다는 것을 깨달았습니다.
합니다: 로 합니다 를 에서 합니다 로 를 docker run -t -d <image-name>
foreground) 를 로 합니다 합니다 로 을 실행합니다.docker run <image-name> -t -d
파워셸 배경에서 온 것은 제게는 분명하지 않았습니다.
저 역시 같은 문제에 직면해 있었지만 다른 방식이었습니다.도커 컨테이너를 만들 때.백그라운드에서 실행 중인 사용하지 않는 컨테이너를 자동으로 중지합니다.때로는 사용 중인 용기를 정지시키기도 합니다.제 상황에서는 도커의 허락 때문입니다.양말 파일이 있어요. 당신이 해야할 일은 :-
도커를 다시 설치합니다.(unbuntu 작업을 할 때 여기서 설치합니다)
명령을 실행하여 권한을 변경합니다.
sudo chmod 666 /var/run/docker.sock
도커 컴포지트 설치(여러 컨테이너를 함께 만들기 위해 컴포지트 파일이 있으므로 선택 사항)
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
최신 버전이 있는지 확인하고 일부 설명에 문제가 없는지 확인합니다.
그런 다음 도커 컨테이너 빌드를 실행합니다.
용기를 작동하려면 전경에서 작동시켜야 합니다.
컨테이너를 포그라운드/디태치 상태로 실행할 수 있는 여러 옵션이 있습니다.그러나 여전히 문제가 해결되지 않았다고 생각되는 경우 로그를 보고 문제를 해결해 볼 수 있습니다.
sudo docker logs -f >> container.log
또한 --syslog를 사용하여 로그에 제공된 추가 세부 정보를 표시할 수도 있습니다.
도커 파일의 App 경로가 올바르지 않음:
Alpine Linux를 사용하여 RHEL 서버에서 Docker 컨테이너로 애플리케이션을 마이그레이션하고 있었습니다.
제작 중 오류가 없어서 컨테이너가 바로 빠져나가는 것을 보고 깜짝 놀랐습니다!
첫번째 기항지:
docker logs <containerID>
이것은 내가 도커 파일에서 CMD에 제공한 바이너리의 경로가 거짓임을 드러냈습니다.
line 0: /sbin/postfix: not found
그것이 어떻게 부서졌는지는 알려주었지만 구체적으로 어디에 있는지는 알려주지 않았습니다.알파인 리눅스에서 바이너리에 대한 정확한 경로가 필요했습니다...
문제 해결:
구글링에서 올바른 경로가 나타나지 않아 도커 파일에 다음 행을 추가했습니다.
RUN which postfix
그런 다음 빌드 명령에 첨부된 아래 명령어로 제공되는 빌드 로깅을 검토하여 값을 검색했습니다.RUN which postfix
--progress=plain > /path/to/build.log 2>&1
수정사항:
빌드를 - 하고 한 했습니다 를 를 했습니다 를 한 를 하고 ./usr/sbin/postfix
합니다. - [ CMD]RUN which postfix
다른 건물을 지었어요
Voila; 그 과정은 이제 계속 진행중입니다.
그래서 더프 경로가 컨테이너를 즉시 빠져나오게 하고 있었습니다.
다음 4가지 명령은 모두 도커 컨테이너를 계속 작동시키기 위해 작동합니다.
docker run -td centos
docker run -dt centos
docker run -t -d centos
docker run -d -t centos
- 먼저 Type 명령을 실행하고 있는 컨테이너가 있는지 확인해야 합니다.
도커 ps -all
- 실행 중인 컨테이너가 있으면 Type 명령을 중지합니다.
도커 중지 컨테이너 ID
이제, 마지막으로 아래 명령을 사용하여 도커를 실행합니다......
-
도커 런 -t -p 2020:3000 도커이미지네임
따라서 구글 크롬을 열고 localhost:2020에 방문하세요.
축하합니다 :)
언급URL : https://stackoverflow.com/questions/30209776/docker-container-will-automatically-stop-after-docker-run-d
'programing' 카테고리의 다른 글
null 값을 외부 키 필드에 전달하는 방법? (0) | 2023.09.15 |
---|---|
utf-8 인코딩된 텍스트를 MySQL 테이블에 로드하는 중 (0) | 2023.09.15 |
$($).wtclick', '#id', 함수({}) 대 $('#id'.wtclick', 함수({}) (0) | 2023.09.15 |
문자열에 붙여넣기 (0) | 2023.09.15 |
size_t 유형의 변수에 대한 교차 플랫폼 형식 문자열? (0) | 2023.09.15 |