2014-10-24 10 views
10

quando aggiungo un file o una directory all'immagine docker da un Dockerfile, utilizzo ADD o COPY, ma il percorso del file che voglio aggiungere o copiare deve avere un percorso relativo alla directory Dockerfile. Esiste un metodo per aggiungere un file o una directory da localhost a un'immagine docker utilizzando il percorso assoluto? a proposito, perché il "docker cp" può supportare solo la copia dei file dall'immagine docker a localhost? al contrario, non funziona?Come posso copiare una directory o un file su un'immagine docker da localhost su ubuntu14.04?

+2

Per citare la documentazione di Docker: La copia rispetta le seguenti regole: Il percorso deve essere all'interno del contesto della generazione; –

+0

Possibile duplicato di [Docker: aggiunta di un file da una directory padre] (http://stackoverflow.com/questions/24537340/docker-adding-a-file-from-a-parent-directory) – Gordon

risposta

11

La risposta breve è che non è supportato.

Dal Docker docs:

Il <src> percorso deve essere all'interno del contesto della build; non è possibile AGGIUNGERE ../qualcosa/qualcosa, perché il primo passaggio di una build finestra mobile consiste nell'inviare la directory di contesto (e le sottodirectory) al daemon docker.

Inoltre, i link simbolici non sono supportati in modo che non è possibile trucco l'accumulo collegando in una posizione diversa sul localhost.

Tuttavia, URL: s sono supportati così un modo per aggirare il problema è quello di servire i file su HTTP se si attiva un server web sul tuo localhost (o in un contenitore di finestra mobile).

Il comando docker cp (sfortunatamente) è supportato solo dal contenitore all'host, non viceversa. Questo è descritto nel docs. Il modo per aggirare questo è usare docker volumes dove i dati possono essere condivisi.

+1

['finestra mobile cp' ] (https://docs.docker.com/engine/reference/commandline/cp/) ora può copiare i file in entrambe le direzioni. – Zaz

0

c'è una soluzione quando si utilizza docker-compose:

api1: 
    build: . 
    dockerfile: cluster/manifests/Dockerfile-NodeAPI 
    ports: 
    - 8080 
    links: 
    - mongo 
    - redis 
    command: "nodemon lib/app.js -e js,json,scss,css,html" 

questo ancora non vi permetterà di fare percorsi parenti, tuttavia BasePath nel Dockerfile sarà ./ invece di cluster/manifests/

1

La soluzione per chi usa il compositore deve utilizzare un volume che punta alla cartella:

#docker-composer.yml 

foo: 
    build: foo 
    volumes: 
    - /local/path/:/path/:ro 

Ma sono abbastanza sicuro che sia possibile giocare con volumes in Dockerfile.

0

Per copiare un file, è sufficiente utilizzare docker cp:

docker cp file.txt CONTAINER:/path/to/dest 

Per copiare una directory, utilizzare un tubo tar:

tar -c "dir/" | docker run -i -a stdin CONTAINER tar -xC /path/to/dest 
0

Spiegazione risposta di wassgren, è possibile anche una finestra mobile SDK a Fai questo. Non sono sicuro di ogni SDK, ma almeno lo docker-java invia il contesto come inputstream alla finestra mobile. Quindi, si specifica dockerClient.withBaseDirectory() e dockerClient.withDockerFile(). Potresti usare un approccio più di scripting e usare gradle o groovy per fare questo ed evitare di dover "compilare" java per questo ogni volta.

Problemi correlati