In newer versions(>=1.8.0) of docker, you can do this
docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
A big save.
EDIT: update versions per raksja's comment
EDIT: comment from @vsevolod: it's possible to get syntax highlighting in VS code by giving files .Dockerfile extension(instead of name) e.g. Prod.Dockerfile, Test.Dockerfile etc.
Answer from Shuo on Stack OverflowIn newer versions(>=1.8.0) of docker, you can do this
docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
A big save.
EDIT: update versions per raksja's comment
EDIT: comment from @vsevolod: it's possible to get syntax highlighting in VS code by giving files .Dockerfile extension(instead of name) e.g. Prod.Dockerfile, Test.Dockerfile etc.
Use docker-compose and multiple Dockerfile in separate directories
Don't rename your
DockerfiletoDockerfile.dborDockerfile.web, it may not be supported by your IDE and you will lose syntax highlighting.
As Kingsley Uchnor said, you can have multiple Dockerfile, one per directory, which represent something you want to build.
I like to have a docker folder which holds each applications and their configuration. Here's an example project folder hierarchy for a web application that has a database.
docker-compose.yml
docker
├── web
│ └── Dockerfile
└── db
└── Dockerfile
docker-compose.yml example:
version: '3'
services:
web:
# will build ./docker/web/Dockerfile
build: ./docker/web
ports:
- "5000:5000"
volumes:
- .:/code
db:
# will build ./docker/db/Dockerfile
build: ./docker/db
ports:
- "3306:3306"
redis:
# will use docker hub's redis prebuilt image from here:
# https://hub.docker.com/_/redis/
image: "redis:alpine"
docker-compose command line usage example:
# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d
# get help
docker-compose --help
In case you need files from parent folder(s) as part of the build context of your Dockerfile
You can still use the above solution and place your Dockerfile in a directory such as docker/web/Dockerfile, all you need is to set the build context in your docker-compose.yml like this:
version: '3'
services:
web:
build:
context: .
dockerfile: ./docker/web/Dockerfile
ports:
- "5000:5000"
volumes:
- .:/code
The files hierarchy would loke like this:
config-on-root.ini
docker-compose.yml
docker
└── web
├── Dockerfile
└── some-other-config.ini
The ./docker/web/Dockerfile will have access to desired files from the context like this:
FROM alpine:latest
COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /
Also note that the build context will contain all the files of the specified directory. Make sure tou use a .dockerignore file to prevent loading undesired large files or directories to save time during build.
Here are some quick commands from tldr docker-compose. Make sure you refer to official documentation for more details.
I'm quite confused by the Docker docs.
I already have several stacks launched through Portainer, but I never used docker-compose before. I can't figure out how (if even possible) to import python scripts into the stack/docker-compose.yml
I'd like to compose some of my custom python scripts from different working Dockerfiles into one docker-compose.
I don't understand if the Dockerfile is still necessary and where (in this example) is specified the name of the Dockerfile/script.py to import in the docker-compose.yml.
Thanks for your time.
Hello,
I was wondering what is the best way to go about creating a project with Dockerfiles. I currently have a test server, and a prod server, and want to develop locally.
Should I have 3 different Dockerfiles that build 3 different images based off which environment I need? Or should there be 1 Dockerfile and that Dockerfile configures itself based off of the environment?
Thanks in advance.