정기 작업에 사용할 때 도커 컨테이너를 시작하는 올바른 방법


41

소프트웨어가 설치 및 구성된 도커 컨테이너가 있습니다.

항상 시작 / 실행해야하는 프로그램이 없습니다.

내가 원하는 것-외부 이벤트에 따라 명령을 시작하는 기능. 처럼:

docker exec mysupercont /path/to/mycommand -bla -for

docker exec mysupercont /path/to/myothercommand 

그러나 컨테이너가 중지되면 "실행"이 불가능 하며이 컨테이너에는 내부에 해당 명령에 사용 된 "작동"데이터가 있으므로 사용할 수 없습니다.

docker run ...

매번 이미지에서 컨테이너를 다시 만들고 내 데이터를 파괴하기 때문입니다.

이러한 컨테이너를 유지하는 "올바른"방법과 "최상의"방법은 무엇입니까? 어떤 명령을 시작할 수 있습니까?


이것은 매우 잘 설명 된 질문입니다. 여기에 다른 유사한 게시물을 참조 하십시오 .
Grant Li

1
docker run -d --name=name container tail -f /dev/null
steampowered

답변:


46

매번 수행 할 필요는 없습니다 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

요약하자면 : 컨테이너 runstart컨테이너 의 차이점을 이해해야합니다 .
또한 "Run"에 대한 매개 변수 " "및 " " 의 역할에 대한 설명서 를 참조 하십시오.-i t-d


1
아하, 나는 이것을 이해한다. 질문 : 컨테이너 내부에서 실행할 것이 없지만 "실행"상태로 유지해야합니다. 따라서 bash를 사용하여 컨테이너를 실행 상태로 유지합니까?
Korjavin Ivan

예. 런타임에 지정한 프로세스가 컨테이너에서 계속 실행되고 있어야합니다. 가장 간단한 예는 bash입니다. 아마도 "-d"로 컨테이너를 시작하고 필요에 따라 컨테이너를 연결하는 가장 쉬운 방법 일 것 docker attach ID입니다. bash를 종료하지 않고이 세션에서 나가십시오.CTRL-p CTRL-q
MSemochkin

컨테이너 실행 중 지정하는 프로세스는 PID 1을받습니다. 따라서 컨테이너가 없으면 컨테이너가 작동하지 않습니다. ☺
MSemochkin

start and attach (또는 -ai로 시작)에 대한 나의 경험은 명령 행의 프롬프트 및 대화식 편집이 표시되지 않는다는 것입니다. 예를 들어 tty는 렌더링 또는 에코가 아닙니다.
dlamblin

1
이것은 멋지다. 컨테이너를 수동으로 다시 시작하지 않고 백그라운드에서 컨테이너를 시작하려면 (예 : 웹 서비스를 실행중인 경우) '-itd'매개 변수를 사용하고 CTRL-p CTRL-q를 사용하여 컨테이너.
taranaki

6

중지 된 컨테이너를 시작할 수 있는지 여부에 대한이 전체 비즈니스는 컨테이너가 처음 작성된 방법 (예 : 실행)에 따라 다릅니다. 종료 된 명령을 실행했거나 대화식 명령 (예 : bash)을 종료 한 경우 중지 된 컨테이너를 시작, 재시작 또는 실행할 수 없습니다. 당신이 할 수있는 것은 그것을 제거하는 것입니다. 정크입니다.

그러나 taranaki의 마지막 주석 인 '-itd'를 사용하면도 커가 주문한 것 같습니다.

컨테이너는 계속 실행되며 원하는대로 실행할 수 있으며 컨테이너를 중지, 시작 또는 다시 시작할 수 있습니다. 물론 이것은 알파인 이미지를 기반으로 한 예비 결과 일뿐입니다. 컨테이너에 연결하면 종료시 컨테이너가 중지되지만 다시 시작할 수 있습니다.


2
+1 "도커 주문한 것으로 보인다":-)
Matt Alexander

5

주기적 작업을 언급하고 사용하려는 방식으로 인해 cron과 같은 것을 사용하고 있기 때문에 docker exec약이 있습니다. 적어도 나는 이런 식으로 끝났다.

  1. 도커 파일

    FROM <some base>
    CMD tail -f /dev/null
    
  2. 평소와 같이 실행하십시오 docker run -d ....(사용했습니다 docker-compose)

  3. 호스트 시스템 crontab 설정 (예 :

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1
    * * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1
    

Docker가 비즈니스 로직의 더 이국적인 수준과 환경 변수를 처리하는 동안 꽤 기본 Linux 환경에서 고대의 입증 된 crontab에 의존 하면서이 솔루션이 훌륭하다는 것을 알았습니다. 주기적인 작업이 멈추거나 메모리 누수 등이있는 경우 일부 제한을 설정할 수도 있습니다.


0

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

1
무엇을하고 있는지 이해하기 어렵다. 3650d
Pieter

1
당신이 옳습니다, 수면은 아마도 내 솔루션만큼 잘 작동하지만 수면은 결국 시간 초과됩니다.
qoomon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.