docker를 사용하여 컨테이너에 연결하지 않고 jupyter 노트북의 로그인 토큰을 호스트 컴퓨터에서 견고하게 인쇄하려고 합니다. 이 컨테이너는 호스트 시스템의 브라우저에서 노트북을 실행하는 데에만 사용됩니다.
(추가) 대화형 모드와 의사 터미널을 사용 docker run -it
하면 백그라운드에서 jupyter를 시작하고 토큰을 인쇄할 수 있습니다. Dockerfile은 jupyter를 CMD
사용 하거나 실행한 다음 screen -S session_name -dm jupyter notebook...
토큰이 반환되면 & disown
bash 루프를 실행합니다 . 그러나 이것이 그 안에 있는 마지막 항목이므로 컨테이너를 종료합니다.echo
jupyter server list
Dockerfile
CMD
예를 들어 실행으로 끝나는 컨테이너를 계속 사용할 수 있으려면 bash
. 이렇게 하면 컨테이너가 계속 실행되지만 -it
호스트 셸도 컨테이너에 연결되어 있기 때문입니다.
그래서 분리 -d
모드, 즉 docker run -itd
. 그런데 호스트 스타우트에서 토큰을 볼 수 없습니다. 그러기 위해서는 달려야 해요.docker logs container-name-here
이것은 일반적인 관행입니다. 아마도 이것이 제가 생각하는 가장 간단한 해결책일 것입니다.하지만 가능하다면 피하고 싶어요!
두 가지 대체 추가 기능을 사용하여 제거를 시도했습니다 -it
.
먼저 거부된 프로세스에 연결을 시도하고 플래그를 추가한 docker run
후 --privileged --cap-add=SYS_PTRACE
dockerfile에 추가하여 아래와 같이 컨테이너를 종료합니다.
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). 마지막으로 반품 추가screen
script /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