컨테이너를 활성 상태로 유지하고 분리된 상태로 유지하면서 stdout을 호스트하기 위해 ENTRYPOINT/CMD에서 에코 프로세스가 시작되었습니까?

컨테이너를 활성 상태로 유지하고 분리된 상태로 유지하면서 stdout을 호스트하기 위해 ENTRYPOINT/CMD에서 에코 프로세스가 시작되었습니까?

docker를 사용하여 컨테이너에 연결하지 않고 jupyter 노트북의 로그인 토큰을 호스트 컴퓨터에서 견고하게 인쇄하려고 합니다. 이 컨테이너는 호스트 시스템의 브라우저에서 노트북을 실행하는 데에만 사용됩니다.

(추가) 대화형 모드와 의사 터미널을 사용 docker run -it하면 백그라운드에서 jupyter를 시작하고 토큰을 인쇄할 수 있습니다. Dockerfile은 jupyter를 CMD사용 하거나 실행한 다음 screen -S session_name -dm jupyter notebook...토큰이 반환되면 & disownbash 루프를 실행합니다 . 그러나 이것이 그 안에 있는 마지막 항목이므로 컨테이너를 종료합니다.echojupyter server listDockerfile CMD

예를 들어 실행으로 끝나는 컨테이너를 계속 사용할 수 있으려면 bash. 이렇게 하면 컨테이너가 계속 실행되지만 -it호스트 셸도 컨테이너에 연결되어 있기 때문입니다.

그래서 분리 -d모드, 즉 docker run -itd. 그런데 호스트 스타우트에서 토큰을 볼 수 없습니다. 그러기 위해서는 달려야 해요.docker logs container-name-here이것은 일반적인 관행입니다. 아마도 이것이 제가 생각하는 가장 간단한 해결책일 것입니다.하지만 가능하다면 피하고 싶어요!

두 가지 대체 추가 기능을 사용하여 제거를 시도했습니다 -it.

먼저 거부된 프로세스에 연결을 시도하고 플래그를 추가한 docker run--privileged --cap-add=SYS_PTRACEdockerfile에 추가하여 아래와 같이 컨테이너를 종료합니다.

echo 0 > /proc/sys/kernel/yama/ptrace_scope`
gdb -p PID

...
Quit anyway? (y or n) [answered Y; input not from terminal]
Detaching from program: /usr/local/bin/python3.12, process 8
[Inferior 1 (process 8) detached]

둘째, dockerfile 앞에 .를 script /dev/null추가 하면 토큰이 성공적으로 인쇄되지만 컨테이너는 종료됩니다(마지막 CMD). 마지막으로 반품 추가screenscript /dev/null; screen -r session_name

Script started, output log file is '/dev/null'.
# 
Script done.
Must be connected to a terminal.

해결책에 대한 아이디어가 있습니까?

답변1

댓글에서 언급했듯이 이것은 제가 요청한 솔루션이 아니었지만 더 나은 옵션이 없기 때문에 제가 선택한 솔루션은 다음과 같습니다.

#!/bin/bash

# docker build+run -d or compose up -d ...

dock_jcontainer="$(docker container ls | awk '{if(NR>1) print $NF}' | grep py)" # I looked for a python container

while true; do
    if docker logs $dock_jcontainer 2>&1 | grep -q "To access the server"; then # Jupyter Notebook log outputs this string
        dock_jlogs=$(docker logs $dock_jcontainer 2>&1)
        break
    fi
done

...

docker logs $dock_jcontainer 2>&1$()​​ 또는 {}로 변환하여 복제 하고 싶지 않을 수도 있습니다 .

답변2

이 시도:

#!/bin/bash

# Container name
dock_jcontainer="$(docker container ls | awk '{if(NR>1) print $NF}' | grep py)"

# Blocking wait until log's grep result is not empty, runs every 2 seconds.
while [ -z "$(docker logs "${dock_jcontainer}" 2>&1 | grep -q 'To access the server')" ]; do
    sleep 2;
done;

# Prints the line you are looking for
printf "$(docker logs "${dock_jcontainer}" 2>&1 | grep -q 'To access the server')\n"

# Functionalize it if you'd like
function grepLogs() {
    docker logs "${dock_jcontainer}" 2>&1 | grep -q 'To access the server'
}; export -f grepLogs

관련 정보