Dev Container and Docker
The development
target of the multi-stage .devcontainer\Dockerfile
is used by .devcontainer/devcontainer.json
to install mdbook
⮳ and rust tooling.
If you don't want to use Dev Container, use the following from the project's root directory to manually build the docker
⮳ image and run it.
docker build --file .devcontainer/Dockerfile --target development --tag rust_howto_dev --build-arg RUST_IMAGE_LABEL=1.75.0-slim-bookworm --build-arg MDBOOK_VERSION=0.4.36 .
docker run --rm --detach --name rust_howto_dev1 --volume $(pwd):/code rust_howto_dev
docker exec -it rust_howto_dev1 bash
To cache the crate and the target folders from run to run, add
--mount type=volume,src=rust_howto_cargo_crate_cache,dst=/usr/local/cargo/registry/
--mount type=volume,src=rust_howto_cargo_target_cache,dst=/cargo-target-rust_howto/
To connect to the (host OS) docker engine from within the container, add
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker-host.sock
Docker Compose
Test the docker compose setup used during developement (which Dev Container runs) with:
cd ./.devcontainer
docker compose build # uses compose.yaml and compose.override.yaml
docker compose up -d
# or simply
docker compose up --build -d
Deployment to GitHub Pages
The continuous integration worflow is found under .github
.
Test the docker compose setup used during CI using:
cd ./.devcontainer
docker compose -f compose.yaml -f compose-ci.yaml build
docker compose -f compose.yaml -f compose-ci.yaml run book # or simply docker compose -f compose.yaml -f compose-ci.yaml up
It uses the ci
target in .devcontainer/Dockerfile
.
To test the docker
⮳ image manually, use
docker build --file .devcontainer/Dockerfile --target ci --tag rust_howto_ci --build-arg RUST_IMAGE_LABEL=1.75.0-slim-bookworm --build-arg MDBOOK_VERSION=0.4.36 .
docker run -it --rm --name rust_howto_ci1 --volume $(pwd)/book:/code/book rust_howto_ci bash
Related Stackoverflow question⮳
Push image to Docker Hub
From the project root folder, use the following to build and push the development
image:
docker build --file .devcontainer/Dockerfile --target development --tag johncd/rust_howto_dev:latest --build-arg RUST_IMAGE_LABEL=1.75.0-slim-bookworm --build-arg MDBOOK_VERSION=0.4.36 .
# or docker tag rust_howto_dev johncd/rust_howto_dev:latest
docker login
# or docker login -u "user" -p "password" docker.io
docker push johncd/rust_howto_dev:latest
Use the following to build and push the CI image:
docker build --file .devcontainer/Dockerfile --target ci --tag johncd/rust_howto_ci --build-arg RUST_IMAGE_LABEL=1.75.0-slim-bookworm --build-arg MDBOOK_VERSION=0.4.36 .
docker login
docker push johncd/rust_howto_ci:latest
- rust and Docker; multistage builds