where should I put .dockerignore? - docker

I have dockerfile in each folder(admin, portal, webpai). and docker-compose file in root only(proxy.yml, services.yml)
where should I put .dockerignore file?
in each folder? or root folder only?

As each build instruction uses the specified directory (containing the Dockerfile) as buildcontext, you need to put the .dockerignore into every folder.

Related

how to copy folder without some inner folders (without the use of .dockerignore)?

I have a the following docker file:
FROM my-reg:7678/py:v11
copy . /app/
# more commands...
I want to copy the content of . without 2 sub-folders: .git and data
I can't use .dockerignore because some docker files use the folder data and some are not.
(the docker files which use data folder use the copy . /app/ command)
The solution here: COPY with docker but with exclusion
is not fit for me:
I want to let the docker file to decide to use or not .dockerignore. and It seems not efficient to copy the folder and after it to remove some sub folders.
Is there a way to give copy command sub folders to ignore ?
Is there a way to instruct the docker file to use .dockerignore file or to ignore it ?
About your questions:
Is there a way to give copy command sub folders to ignore ?
I don't think there is another way to do this if you don't want to delete the copied folders.
Is there a way to instruct the docker file to use .dockerignore file or to ignore it ?
See this post, you can define multiple .dockerignore configs. So you could have one Dockerfile that does not ignore the data folder and one that does.

How to copy multiple directories into a single directory and preserve directory structure

I would like to copy multiple directories (with contents) to a single directory in my container while maintaining the original directory structure of my project. For example, the relevant line in my Dockerfile looks like this:
COPY bin env project ./projects/
The command above only copies files into my projects directory and also removes all of the original directory structure of bin, env, and project.
How can I copy several directories (with contents) such that the original directory structures are preserved? I did find this reference, but as the first commenter points out, directory structure is lost with this method.
you need to create the directory structure since COPY will only add files not the directory itself.
one approach will be aading them one by one.
RUN mkdir -p projects/{bin,env,project}
COPY bin projects/
COPY env projects/
COPY project projects/
or maybe using ADD will be a better approach since Add will decompress archives download files and more.
so you will need to archive directories first, then use add like below
ADD archive.tgz projects/

COPY with docker but with exclusion

In a Dockerfile, I have
COPY . .
I want to exclude an entire directory, in my case, node_modules directory.
Something like this:
COPY [all but **/node_modules/**] .
Is this possible with Docker?
Create file .dockerignore in your docker build context directory (so in this case, most likely a directory that is a parent to node_modules) with one line in it:
**/node_modules
although you probably just want:
node_modules
Info about dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
For those who can't use a .dockerignore file (e.g. if you need the file in one COPY but not another):
Yes, but you need multiple COPY instructions. Specifically, you need a COPY for each letter in the filename you wish to exclude.
COPY [^n]* # All files that don't start with 'n'
COPY n[^o]* # All files that start with 'n', but not 'no'
COPY no[^d]* # All files that start with 'no', but not 'nod'
Continuing until you have the full file name, or just the prefix you're reasonably sure won't have any other files.
FOR A ONE LINER SOLUTION, type the following in Command prompt or Terminal at project root.
echo node_modules >> .dockerignore
This command appends "node_modules" in the .dockerignore file. If the .dockerignore does not exist already, it will create a new one. Replace node_modules with the folder you want to exclude.
Warning:
If you are new to Docker ecosystem and/or you already have the .dockerignore file in your project, please take a backup before proceeding.
BONUS: (as pointed out by Joey Baruch)
(To CREATE/OVERWRITE the .dockerignore file via PowerShell, which can be handled by Docker):
>> echo node_modules | Out-File -Encoding UTF8 .dockerignore
Excluding node_modules from current directory
node_modules
Excluding node_modules in any immediate subdirectories
*/node_modules
Here is the official docs
For those using gcloud build:
gcloud build ignores .dockerignore and looks instead for .gcloudignore
Use:
cp .dockerignore .gcloudignore
Source
Adding .dockerignore works for me.
One additional point Those who are trying this solution on Windows , windows will not let you create .dockerignore file (as it doesn't by default allows creating file starting with .)
To create such file starting with . on Windows, include an ending dot also, like : .dockerignore. and hit enter ( provided you have enabled view extension options from folder options )
I used a multi stage build approach since I needed one stage to have access to the file but not another stage so .dockerignore wouldn't work:
FROM ruby AS builder
COPY app/ app/
# Do stuff with app
# remove the stuff you don't want
RUN rm -Rf app/assets
FROM ruby AS publish
# In my real version I needed the absolute path to builder WORKDIR.
# Since I'm copying from the builder stage, app/assets won't exist
# and neither will it be part of the publish image.
COPY --from=builder app app

Why is my dockerfile not copying directories

in my dockerfile I have these two lines:
ADD /ansible/inventory /etc/ansible/hosts
ADD /ansible/. /ansiblerepo
The first line works, as I can run the container and see my hosts file has been populated with all the ips from my inventory file.
The second line doesn't appear to be working though. I'm just trying to copy all the files/subdirectories of ansible and copy them over to the ansiblerepo directory inside the new container.
There are no errors while building the image, but again ansiblerepo is just an empty directory and nothing has copied over to it. I assume I'm just missing a back slash or something.
Docker ADD and COPY commands work relative to the build directly, and only for files in that directory that weren't excluded with a .dockerignore file. The reason for this is that builds actually run on the docker host, which may be a remote machine. The first step of a docker build . is to package up all the files in the directory (in this case .) and send them to the host to run your build. Any absolute paths you provide are interpreted as relative to the build directory and anything you reference that wasn't sent to the server will be interpreted as a missing file.
The solution is to copy /ansible to your build directory (typically the same folder as your Dockerfile).
Make sure that in your ".dockerignore" file, it does not excluded everything. usually, dockerignore file has these lines
*
!obj\Docker\publish\*
!obj\Docker\empty\
this means that everything is ignored except publish and empty folders.
Removing trailing /. from source directory should fix the ADD command.
On a related note, Docker Best Practices suggest using COPY over ADD if you don't need the URL download feature.

What files do you typically put in .dockerignore

I am building a Django application with docker.
I would like to know for Django or general development work using docker, what files are typically included in the .dockerignore.
I am thinking of the following for now:
.git
*.pyc
You may have noticed that if you put a Dockerfile in your home, and launch a docker build you will see a message uploading context, this means docker creates a .tar with all the files in your home and in all the subdirectories, and uploads this tar to the docker daemon.
If you have some huge files, this may take a long time.
So to avoid this you may
1) create a specific directory, where you put your Dockerfile, and all what is needed for your build
2) tell docker to ignore some files during the build
So you may put in the .dockerignore all the files not needed for your build
This what I typically put in .dockerignore for dockerized Django apps
**/*.pyc
**/*.pyo
**/*.mo
.gitignore
.git/
**/__pycache__/
Dockerfile
db.sqlite3
**/*.md

Resources