소프트웨어가 설치 및 구성된 도커 컨테이너가 있습니다.
항상 시작 / 실행해야하는 프로그램이 없습니다.
내가 원하는 것-외부 이벤트에 따라 명령을 시작하는 기능. 처럼:
docker exec mysupercont /path/to/mycommand -bla -for
과
docker exec mysupercont /path/to/myothercommand
그러나 컨테이너가 중지되면 “실행”이 불가능 하며이 컨테이너에는 내부에 해당 명령에 사용 된 “작동”데이터가 있으므로 사용할 수 없습니다.
docker run ...
매번 이미지에서 컨테이너를 다시 만들고 내 데이터를 파괴하기 때문입니다.
이러한 컨테이너를 유지하는 “올바른”방법과 “최상의”방법은 무엇입니까? 어떤 명령을 시작할 수 있습니까?
답변
매번 수행 할 필요는 없습니다 docker run
.
docker run
실제로는 “create”와 “start”의 두 명령 순서입니다.
컨테이너를 실행할 때 ” -it
“를 지정해야합니다 .
-i, –interactive = false 연결되지 않은 경우에도 STDIN을 열어
둡니다. -t, –tty = false 의사 TTY 할당
예:
docker run -it debian:stable bash
작업이 완료된 후 시작시 지정된 명령 (예제 bash). 예를 들어 “종료”를 수행합니다. 컨테이너 정류장 :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1329c99a831b debian:stable "bash" 51 seconds ago Exited (0) 1 seconds ago goofy_bardeen
이제 다시 시작할 수 있습니다
docker start 1329c99a831b
컨테이너가 시작되고 “bash”명령을 다시 실행합니다.
다음 명령으로이 세션 “bash”에 연결하십시오.
docker attach 1329c99a831b
요약하자면 : 컨테이너 run
와 start
컨테이너 의 차이점을 이해해야합니다 .
또한 “Run”에 대한 매개 변수 ” “및 ” ” 의 역할에 대한 설명서 를 참조 하십시오.-i t
-d
답변
중지 된 컨테이너를 시작할 수 있는지 여부에 대한이 전체 비즈니스는 컨테이너가 처음 작성된 방법 (예 : 실행)에 따라 다릅니다. 종료 된 명령을 실행했거나 대화식 명령 (예 : bash)을 종료 한 경우 중지 된 컨테이너를 시작, 재시작 또는 실행할 수 없습니다. 당신이 할 수있는 것은 그것을 제거하는 것입니다. 정크입니다.
그러나 taranaki의 마지막 주석 인 ‘-itd’를 사용하면도 커가 주문한 것 같습니다.
컨테이너는 계속 실행되며 원하는대로 실행할 수 있으며 컨테이너를 중지, 시작 또는 다시 시작할 수 있습니다. 물론 이것은 알파인 이미지를 기반으로 한 예비 결과 일뿐입니다. 컨테이너에 연결하면 종료시 컨테이너가 중지되지만 다시 시작할 수 있습니다.
답변
주기적 작업을 언급하고 사용하려는 방식으로 인해 cron과 같은 것을 사용하고 있기 때문에 docker exec
약이 있습니다. 적어도 나는 이런 식으로 끝났다.
-
도커 파일
FROM <some base> CMD tail -f /dev/null
-
평소와 같이 실행하십시오
docker run -d ....
(사용했습니다docker-compose
) -
호스트 시스템 crontab 설정 (예 :
* * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1 * * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1
Docker가 비즈니스 로직의 더 이국적인 수준과 환경 변수를 처리하는 동안 꽤 기본 Linux 환경에서 고대의 입증 된 crontab에 의존 하면서이 솔루션이 훌륭하다는 것을 알았습니다. 주기적인 작업이 멈추거나 메모리 누수 등이있는 경우 일부 제한을 설정할 수도 있습니다.
답변
Tail은 때때로 일부 파일 작업을 계속 발생시킵니다.
부작용없이 영원히 잘 수있는 해결책은 다음과 같습니다.
# Ah, ha, ha, ha, stayin' alive...
while true; do :; done & kill -STOP $! && wait $!
작동 원리
while true; do :; done & # do nothing(:) in background, in an endless loop
kill -STOP $! # stop the background process of doing nothing
wait $! # wait forever, because doing nothing process is stopped