Per la mia tesi di laurea all'Università, sto lavorando a un sistema di classifiche di codifica in cui gli utenti possono compilare/eseguire codice non affidabile tramite contenitori di finestra mobile temporanei. Il sistema sembra funzionare bene finora, ma un problema che sto affrontando è che quando viene inviato il codice per un ciclo infinito, per esempio:Timeout Docker per container?
while True:
print "infinite loop"
il sistema va in tilt. Il problema è che quando creo un nuovo contenitore finestra mobile, l'interprete Python impedisce alla finestra mobile di uccidere il contenitore secondario mentre i dati vengono ancora stampati su STDOUT (per sempre). Questo porta alla enorme vulnerabilità del lavoratore portuale di mangiare tutte le risorse di sistema disponibili fino a quando la macchina utilizzando il sistema completamente blocca (illustrato di seguito):
Quindi la mia domanda è: esiste un modo migliore di impostare un timeout su un contenitore di finestra mobile rispetto al metodo corrente che in realtà sarà il uccidere il contenitore finestra mobile e rendere il mio sistema protetto (codice originariamente preso da here)?
#!/bin/bash
set -e
to=$1
shift
cont=$(docker run --rm "[email protected]")
code=$(timeout "$to" docker wait "$cont" || true)
docker kill $cont &> /dev/null
echo -n 'status: '
if [ -z "$code" ]; then
echo timeout
else
echo exited: $code
fi
echo output:
# pipe to sed simply for pretty nice indentation
docker logs $cont | sed 's/^/\t/'
docker rm $cont &> /dev/null
Edit: Il timeout predefinito nella mia applicazione (passato alla variabile $to
) è "10s"/10 secondi.
Ho provato esaminando l'aggiunta di un timer e sys.exit()
alla sorgente Python direttamente, ma questo non è davvero una valida opzione come sembra piuttosto insicuro perché l'utente potrebbe inviare il codice per evitare che l'esecuzione, il che significa che il problema persisterà ancora. Oh, le gioie di essere bloccati su una tesi ... :(
Potrei mancare qualcosa, ma perché non puoi fare qualcosa del tipo: 'ID = $ (finestra mobile run -d unsecure) && finestra mobile run --rm cleanup $ ID', dove cleanup è un contenitore che uccide un altro container dopo X secondi? –
"per sempre" - proviamo a diminuire la dimensione del buffer stdout. Qual è il tuo stato containerizzato ''python' dopo aver inviato il segnale? –
Puoi impostare un limite sul tempo della CPU usando python con le risorse lib, uno script python può essere controllato e modificato in fase di esecuzione usando ast –