I built Container-Make (cm) because I was tired of maintaining both a Makefile (for terminal users) and a .devcontainer folder (for VS Code users) in my projects. I wanted devcontainer.json to be the single source of truth, but I didn't want to be forced to use VS Code.
The Problem: Running dev containers from the CLI manually is painful. You have to handle docker run flags, volume mounts, port forwarding, and worst of all—file permissions on Linux.
How cm solves it: It parses your standard devcontainer.json and spins up ephemeral containers to run commands. It acts like make, but everything runs inside the container defined by your config.
Technical Details (for the curious):
Language: Written in Go (1.25+) using the official Docker SDK.
Permission Handling: This was the hardest part. I implemented a dynamic entrypoint script that checks the uid/gid of your workspace and creates a matching user inside the container on-the-fly using adduser/su-exec. This solves the "files owned by root" issue on Linux host mounts.
TTY & Signals: It puts the terminal in raw mode and forwards signals (SIGINT/SIGTERM) correctly, so interactive tools like htop or vim work seamlessly.
Performance: It leverages Docker BuildKit for caching.
Current Status: It supports image, build.dockerfile, forwardPorts, postCreateCommand hooks, and environment variables. "Features" support is currently being worked on.
Repo: https://github.com/UPwith-me/Container-Maker.git
I’d love to hear your feedback on the implementation, specifically around the signal handling logic!