Skip to content

Image Resolution Reference

During jailoc up, the container image is resolved through a cascade of up to five steps evaluated in priority order. The first step that applies wins; all later steps are skipped.


Resolution Cascade

flowchart TD
  start(["jailoc up"]) --> s1{"[1] workspace.image set?"}
  s1 -- yes --> r1["Use image directly<br>(Compose pulls natively)"]
  s1 -- no --> s2{"[2] defaults.image set<br>AND workspace.dockerfile set?"}
  s2 -- yes --> r2["Build workspace overlay<br>using defaults.image as base<br>(build failure is fatal)"]
  s2 -- no --> s3{"[3] defaults.image set<br>(no workspace dockerfile)?"}
  s3 -- yes --> r3["Use defaults.image directly<br>(Compose pulls natively)"]
  s3 -- no --> s4{"[4] base.dockerfile set?"}
  s4 -- yes --> r4["Load (local path or HTTP URL)<br>build → tag jailoc-base:preset-hash<br>(failure is fatal)"]
  s4 -- no --> r5["Build from embedded Dockerfile<br>tag jailoc-base:embedded"]

Step Details

Step 1: Workspace image (direct use)

Trigger: image is set in [workspaces.<name>].

Behavior: - The specified image is written directly into the generated docker-compose.yml. - Compose pulls the image from its registry at container startup — no explicit pull call is made by jailoc. - No build steps run. dockerfile and build_context are not consulted.

Constraints: - image cannot be combined with dockerfile or build_context in the same workspace block. Setting both is a validation error at config load time.


Step 2: Defaults image with workspace overlay build

Trigger: image is set in [defaults], and dockerfile is set in [workspaces.<name>].

Behavior: - The workspace Dockerfile is loaded from the specified source (local path or HTTP URL). - An overlay image is built on top of defaults.image, passed as the BASE build argument. - The workspace Dockerfile must begin with:

ARG BASE
FROM ${BASE}
  • Tags the result as jailoc-{name}:<content-hash>, where <content-hash> is the first 8 characters of the SHA-256 hash of the Dockerfile content.

Build context: - If build_context is set in the workspace, that directory is used. - If build_context is empty and dockerfile is a local path, the parent directory of the Dockerfile is used. - If build_context is empty and dockerfile is an HTTP URL, a temporary directory is used.

Constraints: - Build failure is fatal. There is no fallback. - Maximum download size for HTTP Dockerfile sources: 1 MiB.


Step 3: Defaults image (direct use)

Trigger: image is set in [defaults], and dockerfile is not set in the workspace.

Behavior: - The defaults.image value is written directly into the generated docker-compose.yml. - Compose pulls the image from its registry at container startup — no explicit pull call is made by jailoc. - No build steps run.


Step 4: Base Dockerfile (custom base build)

Trigger: dockerfile is set in [base], and no workspace image or defaults.image is configured.

Behavior: - Loads the Dockerfile from the specified source (local path or HTTP URL). - Builds a local image from the loaded content. - Tags the result as jailoc-base:preset-<content-hash>, where <content-hash> is the first 8 characters of the SHA-256 hash of the Dockerfile content.

After this step, a workspace dockerfile (if set) is still applied as an overlay on top of the built base.

Constraints: - Accepted sources: absolute local paths (/...), tilde paths (~/...), HTTP(S) URLs. - Maximum download size for HTTP sources: 1 MiB. Files exceeding this limit cause a fatal error. - Load or build failure is fatal. There is no fallback to the embedded image. - See Configuration Reference for accepted formats and validation rules.


Step 5: Embedded fallback

Trigger: None of the above steps apply.

Behavior: - Builds an image from the Dockerfile embedded in the jailoc binary at compile time. - Tags the result as jailoc-base:embedded.

This step always succeeds (assuming a functional Docker daemon), as the Dockerfile is bundled with the binary.

After this step, a workspace dockerfile (if set) is applied as an overlay on top of the embedded base.


Workspace overlay (steps 4 and 5 only)

When the cascade reaches step 4 or 5, a workspace dockerfile is applied as an additional layer on top of the resolved base image. Steps 1, 2, and 3 handle the workspace Dockerfile themselves (or bypass it entirely) and do not reach this stage.

flowchart TD
  base["Base image<br>(from step 4 or 5)"] --> check{"workspace.dockerfile set?"}
  check -- yes --> build["Load (local path or HTTP URL)<br>build with --build-arg BASE=base<br>tag jailoc-name:hash"]
  check -- no --> asis["Use base image as-is"]

Image Tag Summary

Source Tag
Workspace image (direct) unchanged (Compose uses as-is)
defaults.image with workspace overlay jailoc-{name}:<content-hash>
defaults.image (direct) unchanged (Compose uses as-is)
[base].dockerfile (local or HTTP) jailoc-base:preset-<content-hash>
Embedded fallback jailoc-base:embedded
Workspace overlay (on top of step 4/5) jailoc-{name}:<content-hash>

See the custom images how-to for practical instructions on each resolution step.