2015-01-08 13 views
5

Sto utilizzando la finestra mobile in Ubuntu. Durante la fase di sviluppo ho clonato tutto il codice sorgente da Git nell'host, li ho modificati in WebStorm e li ho eseguiti con Node.js all'interno di un contenitore docker con -v /host_dev_src:/container_src in modo che possa eseguire il test.Copia i file dall'host al contenitore docker, quindi esegui il commit e premi

Poi quando ho voluto inviarli per il test: ho impegnato il contenitore e ho spinto una nuova versione. Ma quando ho tirato e eseguito l'immagine sulla macchina di prova, mancava il codice sorgente. È logico che nella macchina di prova non sia disponibile lo /host_src.

La mia soluzione attuale consiste nel clonare il codice sorgente sulla macchina di prova ed eseguire la finestra mobile con -v /host_test_src:/container_src. Ma mi piacerebbe sapere se è possibile copiare il codice sorgente direttamente nel contenitore ed evitare tale manipolazione. Preferirei semplicemente copiare, incollare ed eseguire il file immagine con il codice sorgente, soprattutto perché non c'è alcuna connessione Internet sulle nostre macchine di test.

PS: Sembra che lo docker cp supporti solo la copia del file dal contenitore all'host.

risposta

2

Una soluzione è quella di avere un passo git clone nella Dockerfile che aggiunge il codice sorgente nell'immagine. Durante lo sviluppo, è possibile sovrascrivere questo codice con l'argomento -v su docker run in modo da poter apportare modifiche senza ricostruire. Quando si tratta di test, basta controllare le modifiche e creare una nuova immagine. Ora hai un'immagine completamente autonoma da testare.

Si noti che se si dispone di un'istruzione VOLUME nel file Docker, è necessario assicurarsi che si verifichi dopo il passaggio clone git.

Il problema con questo approccio è che se si utilizza un linguaggio compilato, si desidera solo i binari di vivere nell'immagine finale. In questo caso, il clone git deve essere sostituito con un codice che preleva o compila i binari.

+0

Grazie per il suggerimento sull'ordine VOLUME. Ho sempre pensato che non si possa scrivere su volumi da un Dockerfile perché ho solo provato il primo VOLUME (che a me sembra più logico). – seanmcl

+0

Sì, i volumi sono piuttosto sottili. Ha senso quando capisci come funzionano. Il mio blog potrebbe aiutare http://container-solutions.com/2014/12/understanding-volumes-docker/ –

1

tratti prego i vostri codici sorgente sono i dati, poi li pacchetto come contenitore di dati, vedere https://docs.docker.com/userguide/dockervolumes/

Fase 1 Crea app_src finestra mobile immagine

mettere uno Dockerfile all'interno del vostro repo git come

FROM BUSYBOX 
ADD . /container_src 
VOLUME /container_src 

Quindi è possibile creare un'immagine di origine come

docker build -t app_src . 

Durante il periodo di sviluppo, è sempre possibile utilizzare la vecchia soluzione -v /host_dev_src:/container_src.

Fase 2 Transfer questa immagine finestra mobile immagine app come

È possibile trasferire questa immagine app_src per testare sistema simile all'immagine applicazione, probabilmente attraverso registro finestra mobile

Fase 3 Esegui come contenitore di dati

Nel sistema di test, eseguire il contenitore app sopra di esso. (Io uso ubuntu per demo)

docker run -d -v /container_src --name code app_src 
docker run -it --volumes-from code ubuntu bash 
[email protected]:/# ls /container_src 
Dockerfile hello.c 
[email protected]:/# 

spero che dà aiutare

(dare crediti a https://github.com/toffer/docker-data-only-container-demo, che ricevo dettaglio idee)

+0

quindi non si portano ancora i file di origine con il contenitore ei tester dovrebbero ottenere l'immagine separatamente e le sorgenti separatamente –

+0

codice sorgente di imballaggio all'interno dell'immagine app è anche una buona soluzione per la consegna interna (a.k.una versione di debug). Cerco di separarlo qui. –

0

Si potrebbe provare e avere due Dockerfiles. Lo base si sa come eseguire l'app da una cartella predeterminata, ma non dichiararlo volume. Durante lo sviluppo eseguirai questo contenitore con la tua cartella host montata come volume. Un altro, lo package, erediterà il file base e copierà/aggiungerà i file dalla directory host, sempre senza volumi, in modo da portare tutti i file nell'host del tester.

+0

Il Dockerfile 'package' probabilmente siederà alla radice del tuo' host_dev_src' per poter prendere i file dal tuo host fs. –

1

aggiunta alla risposta di Adriano, faccio git clone, e quindi faccio

CMD git pull && start-my-service 

in modo che il codice più recente presso la filiale verificato venga eseguito. Questo ovviamente non è per tutti, ma funziona in alcuni modelli di rilascio del software.

Problemi correlati