You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.1 KiB
Markdown
100 lines
3.1 KiB
Markdown
# Dockerfile+
|
|
|
|
This project provides Dockerfile syntax extensions that have been rejected by the moby project or haven't been addressed in a long time.
|
|
|
|
Currently, the project adds an `INCLUDE+` Dockerfile directive that allows you to import the content of another file into your Dockerfile. There are plans to add more features in the near future.
|
|
|
|
- [Getting started](#getting-started)
|
|
- [Features](#features)
|
|
- [INCLUDE+](#include)
|
|
- [Roadmap](#roadmap)
|
|
- [Feedback](#feedback)
|
|
|
|
## Getting started
|
|
|
|
- First, you need to make sure you are running a compatible version of Docker: you need at least Docker 18.09. If you are using an older version, you are out of luck. Sorry!
|
|
- Export the following environment variables to enable Buildkit: `DOCKER_BUILDKIT=1` and `COMPOSE_DOCKER_CLI_BUILD=1` (this might not be necessary for newer installations of Docker)
|
|
|
|
Once your Docker is set, you just need to add the following line as your first line in your Dockerfile:
|
|
|
|
```Dockerfile
|
|
# syntax = edrevo/dockerfile-plus
|
|
```
|
|
|
|
That's it!
|
|
|
|
## Features
|
|
|
|
### INCLUDE+
|
|
|
|
Right now there is just one extra instruction: `INCLUDE+`. All Dockerfile+ commands will end up with a `+` sign to avoid any potential future collisions with Dockerfile commands.
|
|
|
|
`INCLUDE+` will import the verbatim contents of another file into your Dockerfile. Here's an example Dockerfile which uses the `INCLUDE+` instruction:
|
|
|
|
```Dockerfile
|
|
# syntax = edrevo/dockerfile-plus
|
|
|
|
FROM alpine
|
|
|
|
INCLUDE+ Dockerfile.common
|
|
|
|
ENTRYPOINT [ "mybin" ]
|
|
```
|
|
|
|
If Dockerfile.common contained a single line that said `RUN echo "Hello World"`, then the resulting Docker image would be identical to the one generated by this Dockerfile:
|
|
|
|
|
|
```Dockerfile
|
|
FROM alpine
|
|
|
|
RUN echo "Hello World"
|
|
|
|
ENTRYPOINT [ "mybin" ]
|
|
```
|
|
|
|
## Roadmap
|
|
|
|
The next features in line would be:
|
|
|
|
- `ENVFILE+` command, which would read a .env file and import all of those environment variable definitions into the Dockerfile
|
|
- `RUN+ --no-cache`, which would disable the cache only for a specific RUN step (useful for non-idempotent commands, for example those that clone git repos)
|
|
- `TAG` command
|
|
- improvements to .dockerignore, like recursive dockerignore files
|
|
|
|
## Feedback
|
|
|
|
Found a bug? Want to contribute a PR? Want to improve documentation or add a cool logo for the project? All contributions are welcome!
|
|
|
|
### Development environment
|
|
|
|
Install cargo (you can use [rustup.rs](https://rustup.rs/)) and run:
|
|
|
|
```bash
|
|
$ cargo build
|
|
```
|
|
|
|
### Creating a local release of the Buildkit frontend
|
|
|
|
```bash
|
|
$ docker build -f dockerfile-plus/Dockerfile .
|
|
```
|
|
|
|
### Creating multi-arch build
|
|
- Enable Experiment in docker config. Add {"experimental": true} to docker daemon.json
|
|
- Setup BuildKit local build container
|
|
```
|
|
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
|
docker buildx create --name multiarch --driver docker-container --use
|
|
docker buildx inspect --bootstrap
|
|
```
|
|
- Run following to start multi-arch build
|
|
```
|
|
docker buildx build \
|
|
--platform linux/arm64/v8,linux/amd64 \
|
|
--tag edrevo/dockerfile-plus:latest \
|
|
-f dockerfile-plus/Dockerfile \
|
|
--load ## or --push to push DockerHub \
|
|
.
|
|
```
|
|
|