'Copy directory to another directory using ADD command
I have read http://docs.docker.com/engine/reference/builder/#add however I met a problem. I want to copy the local directory go
to docker /user/local/
I tried:
ADD go /usr/local/
and:
ADD /go/ /usr/local/
also:
RUN chmod 0755 /usr/local/go/src/make.bash
However, I see the following error message:
/usr/local/go/src/make.bash: No such file or directory
but the local go
directory does contain make.bash
.
Solution 1:[1]
ADD go /usr/local/
will copy the contents of your local go
directory in the /usr/local/
directory of your docker image.
To copy the go
directory itself in /usr/local/
use:
ADD go /usr/local/go
or
COPY go /usr/local/go
Solution 2:[2]
Indeed ADD go /usr/local/
will add content of go
folder and not the folder itself, you can use Thomasleveil solution or if that did not work for some reason you can change WORKDIR
to /usr/local/
then add your directory to it like:
WORKDIR /usr/local/
COPY go go/
or
WORKDIR /usr/local/go
COPY go ./
But if you want to add multiple folders, it will be annoying to add them like that, the only solution for now as I see it from my current issue is using COPY . .
and exclude all unwanted directories and files in .dockerignore
, let's say I got folders and files:
- src
- tmp
- dist
- assets
- go
- justforfun
- node_modules
- scripts
- .dockerignore
- Dockerfile
- headache.lock
- package.json
and I want to add src assets package.json justforfun go
so:
in Dockerfile:
FROM galaxy:latest
WORKDIR /usr/local/
COPY . .
in .dockerignore file:
node_modules
headache.lock
tmp
dist
In this way, you ignore node_modules headache.lock tmp dist
so they will not be added!
Or for more fun (or you like to confuse more people make them suffer as well :P) can be:
*
!src
!assets
!go
!justforfun
!scripts
!package.json
In this way you ignore everything, but exclude what you want to be copied or added only from the "ignore list".
It is a late answer but adding more ways to do the same covers even more cases.
Solution 3:[3]
You can use COPY. You need to specify the directory explicitly. It won't be created by itself
COPY go /usr/local/go
Reference: Docker CP reference
Solution 4:[4]
This can help if you want to add all files to a specified location
#ADD XML SUITE files ADD src/test/resources/xmls/* /usr/share/tag/
Solution 5:[5]
As the official docs state:
The directory itself is not copied, just its contents.
The trick is to concat in the <dest>
path also the folder name, like this:
COPY src ./src
Even if ./src does not exist in the container yet, the command COPY internally creates it and copies the content of src into the new folder (which is ./src).
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Thomasleveil |
Solution 2 | |
Solution 3 | Amstel D'Almeida |
Solution 4 | Sritaj Patel |
Solution 5 | Davide Calarco |