Non è semplice ma può essere effettuato tramite wget
o curl
con un piccolo supporto da python
. (Tutti e tre gli strumenti di solito dovrebbe essere disponibile su un sistema *nix
.)
wget
non funziona quando nessun url
è dato e
curl file://localhost/home/user/program.zip -o /tmp/
non funziona all'interno di un RUN
istruzioni s' Dockerfile
. Quindi, avremo bisogno di un server che sia wget
e curl
possa accedere e scaricare program.zip
da.
Per fare ciò installiamo un piccolo server python
che serve le nostre richieste http
. Per questo utilizzeremo il modulo http.server
da python
. (È possibile utilizzare python
o python 3
. Funzionerà con entrambi.).
python -m http.server --bind 192.168.178.20 8000
Il server python
servirà tutti i file nella directory viene avviato in. Quindi, è necessario assicurarsi che si avvia il server sia nella directory del file che si desidera scaricare durante il vostro costruire un'immagine risiede o creare una directory temporanea che contiene il tuo programma. A scopo illustrativo creiamo il file foo.txt
che verrà in seguito scaricare via wget
nel nostro Dockerfile
:
echo "foo bar" > foo.txt
Quando si avvia il server http, è importante che noi specificare l'indirizzo IP della nostra macchina locale sulla LAN. Inoltre, apriremo Port 8000. Dopo aver fatto questo si dovrebbe vedere il seguente output:
python3 -m http.server --bind 192.168.178.20 8000
Serving HTTP on 192.168.178.20 port 8000 ...
Ora costruiamo una Dockerfile
per illustrare come funziona.(Si assume che il file foo.txt
deve essere scaricato in /tmp
):
FROM debian:latest
RUN apt-get update -qq \
&& apt-get install -y wget
RUN cd /tmp \
&& wget http://192.168.178.20:8000/foo.txt
Ora si comincia la costruzione con
docker build -t test .
Durante la compilazione si vedrà il seguente output sul nostro server python
:
172.17.0.21 - - [01/Nov/2014 23:32:37] "GET /foo.txt HTTP/1.1" 200 -
e l'uscita di costruzione della nostra immagine sarà:
0.123.
Step 2 : RUN cd /tmp && wget http://192.168.178.20:8000/foo.txt
---> Running in 49c10e0057d5
--2014-11-01 22:56:15-- http://192.168.178.20:8000/foo.txt
Connecting to 192.168.178.20:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25872 (25K) [text/plain]
Saving to: `foo.txt'
0K .......... .......... ..... 100% 129M=0s
2014-11-01 22:56:15 (129 MB/s) - `foo.txt' saved [25872/25872]
---> 5228517c8641
Removing intermediate container 49c10e0057d5
Successfully built 5228517c8641
È quindi possibile verificare se davvero lavorato avviando e inserendo un contenitore dal immagine appena costruire:
docker run -i -t --rm test bash
Si può quindi cercare in /tmp
per foo.txt
.
Ora possiamo aggiungere qualsiasi file al nostro image
senza creare un nuovo livello. Supponendo che si desidera aggiungere un programma di circa 5 GB come indicato nella domanda che potremmo fare:
FROM debian:latest
RUN apt-get update -qq \
&& apt-get install -y wget
RUN cd /tmp \
&& wget http://conventiont:8000/program.zip \
&& unzip program.zip \
&& cd program \
&& make \
&& make install \
&& cd /tmp \
&& rm -f program.zip \
&& rm -rf program
In questo modo non saremo lasciati con 10 GB di cruft.
Non puoi semplicemente decomprimerlo prima sul tuo computer locale? E poi aggiungi le cose che ti servono? – Nick
Sì, ma voglio anche eliminare la cartella decompressa in quanto sarà ancora superiore a 5 GB. Ma ho trovato un modo per fare ciò che voglio. La risposta è sulla sua strada. –
e un file make.sh che crea e rimuove il file? – Rondo