2015-09-23 17 views
25

Cercando di correggere gli errori e problemi di debug con la mia applicazione che è suddiviso su diversi contenitori, posso modificare spesso file in contenitori:Come modificare i file in smesso/non partire finestra mobile contenitore

  • o io sono totalmente pigro ed installare nano e modificare direttamente nel contenitore o

  • ho Docker cp il file dal contenitore, modificarlo, copiarlo indietro e riavviare il contenitore

Questi sono passaggi intermedi prima di giungere a nuovi contenuti per la compilazione del contenitore, che richiede molto più tempo rispetto al precedente (che ovviamente è solo intermedio/giocherellando).

Ora interrompo frequentemente il programma iniziale del contenitore, che nei casi di rottura è uno script nodo o uno script web server python, entrambi tipicamente non riescono dagli errori di sintassi.

C'è un modo per salvare quei contenitori? Dal momento che non si avviano, non posso eseguire il docker in loro, e quindi sono persi per me. Passo quindi alla rotta rm/rmi/build/run dopo aver corretto il file incriminato nell'input della build.

Come posso modificare i file in un contenitore arrestato, oppure inserirli in cp o avviare una shell in un contenitore arrestato? Qualcosa che mi consente di risolvere questo contenitore?

(sembra un po 'come lavorare su un computer remoto e rompere la configurazione di rete - connessione è persa "per sempre" in questo modo e si deve usare un ripiego, se esiste.)

How to edit Docker container files from the host? sembra rilevante ma è obsoleto.

+0

Anche questo potrebbe essere una soluzione alternativa http://stackoverflow.com/a/32353134/586754 - sperando ancora in una soluzione migliore. –

+1

forse dovresti considerare di montare un volume in modo da poter modificare i file sul tuo host invece che nel contenitore. Una volta felice con il tuo codice, sei libero di 'docker cp' i file nel contenitore (o crea una nuova immagine) – Thomasleveil

+0

Sì, sarebbe un po 'tardi se non avessi impostato le cose fin dall'inizio. Questo non funziona per il recupero, penso. –

risposta

34

Rispondere alla mia domanda .. sperando ancora in una risposta migliore da una persona più competente !!

Ci sono 2 possibilità.

1) Modifica del file system sull'host direttamente. Questo è un po 'pericoloso e ha la possibilità di rompere completamente il contenitore, possibilmente altri dati a seconda di cosa va storto.

2) Modificare lo script di avvio a qualcosa che non manca mai come iniziare un bash, facendo le correzioni/modifiche e poi cambiare di nuovo il programma di avvio a quella desiderata (come nodo o quello che era prima).

Maggiori dettagli:

1) Utilizzando

docker ps 

per trovare i contenitori in esecuzione o

docker ps -a 

per trovare tutti i contenitori (incluse le fermate) e

docker inspect (containername) 

cercare "Id", uno dei primi valori.

Questa è la parte che contiene i dettagli dell'implementazione e potrebbe cambiare, tenere presente che si potrebbe perdere il contenitore in questo modo.

Vai

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/ 

e vi troverai tutti i file che vengono modificati verso l'immagine del contenitore si basa su. È possibile sovrascrivere file, aggiungere o modificare file.

Ancora una volta, non lo consiglierei.

2) Come è descritto in https://stackoverflow.com/a/32353134/586754 trovi la config.json configurazione di JSON in un percorso come

/var/lib/docker/containers/9bc343a99..(long container id)/config.json 

Non c'è possibile modificare le args da e. g. "nodejs app.js" in "/ bin/bash". Ora riavvia il servizio finestra mobile e avvia il contenitore (dovresti vedere che ora si avvia correttamente). È necessario utilizzare

docker start -i (containername) 

per assicurarsi che non si interrompa immediatamente. Ora è possibile lavorare con il contenitore e/o poi fissare con

docker exec -ti (containername) /bin/bash 

Inoltre, finestra mobile cp è piuttosto utile per la copia di file che sono stati modificati al di fuori del contenitore.

Inoltre, si dovrebbe ricorrere a tali misure solo se il contenitore è più o meno "perso" in ogni caso, quindi qualsiasi modifica sarebbe un miglioramento.

+0

Ancora sperando in una risposta migliore - quindi sentiti libero di dartene uno, sposterò anche il tag "ansered". –

+0

Ho usato il secondo modo e ho dovuto riavviare il servizio docker per forzare la sovrascrittura dei file '' '' config.json''' ogni volta che li ho modificati –

+2

Ho config.v2.json e ogni volta che avvio il contenitore zombi , ripristina il mio aggiornamento Path/EntryPoint e muore ancora una volta. L'uso di "docker cp" per aggiornare lo script di entrypoint.sh per eseguire semplicemente bash l'ha corretto. –

Problemi correlati