Run 7-Zip in Docker for Automated Pipelines

Running 7-Zip inside Docker provides a standardized, isolated, and cross-platform way to handle archive compression and extraction in continuous integration and deployment (CI/CD) pipelines. This guide covers selecting the appropriate 7-Zip package for Linux containers, building a minimal Docker image, executing compression commands via mounted volumes, and embedding the container into automated workflow pipelines.

1. Choosing the 7-Zip Linux Binary

On Linux-based containers, you have two primary options:

  • 7zip (Official CLI / 7zz): The modern, officially supported command-line version developed by Igor Pavlov.
  • p7zip: A legacy POSIX port of 7-Zip commonly found in older package managers.

For modern pipelines, using the official package via Alpine or Debian ensures the best performance, security, and compatibility with modern archive formats.

2. Creating a Lightweight Dockerfile

Alpine Linux is ideal for CI/CD environments because it produces an image smaller than 20 MB, reducing download and startup times during pipeline runs.

Create a Dockerfile:

FROM alpine:3.20

# Install the official 7-Zip package
RUN apk add --no-cache 7zip

# Set the working directory for file operations
WORKDIR /workspace

# Set 7zz as the default entry point
ENTRYPOINT ["7zz"]

Build the Docker image locally or in your container registry:

docker build -t pipeline-7zip:latest .

3. Running 7-Zip Commands via Docker

To compress or extract files from the host system, mount your target directory into the container's working directory (/workspace) using Docker volumes.

Compressing Files

To compress files into an ultra-compressed .7z archive:

docker run --rm \
  -v "$(pwd)":/workspace \
  pipeline-7zip:latest \
  a -t7z -mx=9 archive.7z ./artifacts/
  • a: Adds files to an archive.
  • -t7z: Specifies the archive format as 7z.
  • -mx=9: Applies ultra-level compression.

Extracting Files

To extract an archive with preserved directory structures:

docker run --rm \
  -v "$(pwd)":/workspace \
  pipeline-7zip:latest \
  x archive.7z -o./extracted/
  • x: Extracts files with full paths.
  • -o./extracted/: Specifies the output directory.

4. Integrating into Automated Pipelines

Containerized 7-Zip can be run natively in modern pipeline systems without requiring 7-Zip to be pre-installed on the host agent.

GitHub Actions Example

jobs:
  compress-artifacts:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Archive Files with 7-Zip
        run: |
          docker run --rm \
            -v "${{ github.workspace }}":/workspace \
            alpine:3.20 sh -c "apk add --no-cache 7zip && 7zz a -mx=9 release.7z ./build/"

GitLab CI Example

package-job:
  image: alpine:3.20
  stage: build
  before_script:
    - apk add --no-cache 7zip
  script:
    - 7zz a -mx=9 build-artifacts.7z ./bin/
  artifacts:
    paths:
      - build-artifacts.7z

5. Pipeline Best Practices

  • Prebuild and Cache the Image: Avoid running apk add inside every pipeline run. Build pipeline-7zip:latest once, push it to your private container registry, and reference that image directly to save execution time.
  • Set Container Permissions: When running in environments where root privileges cause file ownership issues on the host, pass --user "$(id -u):$(id -g)" to the docker run command.
  • Limit Resource Usage: High compression levels (like -mx=9) can consume significant RAM and CPU. Set CPU and memory limits on your container (--memory="2g" --cpus="2") to prevent pipeline runners from crashing out-of-memory.