- Docker-based local/remote (cloud) Integrated Development Environment (IDE) with a idea of how webIDE platforms like repl.it and VPSes operate
- docker
- docker-compose
This repository is designed to be used with a containerization platform like Docker or LXC, and orchestration systems like Kubernetes (K8s), However, for educational purposes, the following steps is how you would set this up
- Methodologies
- Install dependencies, APIs, libraries, frameworks, SDKs on host system
- Using Virtual Machines
-
Build docker image
docker build --tag=[author/image-name]:[version|tag] {--build-args [ARGUMENT_VARIABLE="value"]} -f [custom-dockerfile-template] [context]
-
Startup using docker run
docker run -itd \ --name=[container-name] \ --restart=unless-stopped \ -e "ENV_VAR=value" \ --env-file="/path/to/environment-file" \ --workdir="[container-working-directory]" \ -p "[host-system-port]:[container-port]" \ -v "[host-system-volume]:[container-volume]" \ [author]/[image-name]:[image-tag|version]
-
Build your base (stage 1) IDE docker image
docker build --tag=thanatisia/docker-ide:[base-distribution] \ -f docker/Dockerfiles/[base-distribution]/programming-languages/[language].Dockerfile \ .
-
(Optional) Build all following stages 2 to N on top of your stage 1 docker image (Development Environment)
- Additional patch docker image templates (Dockerfiles)
docker build --tag=[author]/docker-ide:[tag|version] \ -f docker/Dockerfiles/[base-distribution]/add-on-images/[patch-name].Dockerfile \ .
- Frameworks
docker build --tag=[author]/docker-ide:[tag|version] \ -f docker/Dockerfiles/[base-distribution]/frameworks/[framework].Dockerfile \ .
- Additional patch docker image templates (Dockerfiles)
-
Design docker-compose.yaml file
- Notes
- You can find example docker-compose.yaml configuration files in the 'docker/compose' directory
- The 'build' instruction/key-value (dictionary) is optional if you have performed multi-staged builds as recommended previously
- You can use this if you are intending to use the base image directly
version: 3.7 services: [programming-language]: image: author-name/docker-ide:[programming-language] container_name: dev-env-[programming-language] build: context: . dockerfile: docker/Dockerfiles/[base-distribution]/programming-languages/[programming-language].Dockerfile restart: unless-stopped working_dir: /projects ## Set current working directory stdin_open: true # Equivalent to '-i' in 'docker run -itd' tty: true # Equivalent to '-t' in 'docker run -itd' # ports: ## Port Forward/Translate/Map from host system to container ## [host-ip-address]:[host-system-port]:[container-port] volumes: ## Mount volumes from host system into container ## [host-system-volume]:[container-volume]:[permissions] - ${PWD}/projects/:/projects - ${HOME}/.config:${HOME}/.config
- Notes
-
Startup compose environment
docker-compose up -d --build
-
Stop and teardown compose environment
docker-compose down
-
Start container
docker-compose start {container-name}
-
Stop container
docker-compose stop {container-name}
-
Restart container(s)
docker-compose restart {container-name}
-
Using Makefile
- Configure the following Makefile environment variables
- Stop all running containers, Remove containers
make -k stop remove
- Build your base (stage 1) IDE docker image
make build-stage-1
- (Optional) Build all following stages 2 to N on top of your stage 1 docker image (Development Environment)
- Notes
- Ensure that you add build-stage-{3..N} manually at the current time because the Makefile at the moment only contains specifications for build stages 1 and 2
make build-stage-2 build-stage-3 ... build-stage-N
- Notes
- Startup and run a new container using a target built image
make run
- Chroot and enter contaimer
make enter
-
Using docker-compose environment
- Build your base (stage 1) IDE docker image
docker build --tag=thanatisia/docker-ide:[base-distribution] \ -f docker/Dockerfiles/[base-distribution]/programming-languages/[language].Dockerfile \ .
- (Optional) Build all following stages 2 to N on top of your stage 1 docker image (Development Environment)
- Additional patch docker image templates (Dockerfiles)
docker build --tag=[author]/docker-ide:[tag|version] \ -f docker/Dockerfiles/[base-distribution]/add-on-images/[patch-name].Dockerfile \ .
- Frameworks
docker build --tag=[author]/docker-ide:[tag|version] \ -f docker/Dockerfiles/[base-distribution]/frameworks/[framework].Dockerfile \ .
- Additional patch docker image templates (Dockerfiles)
- Configure and Prepare your docker-compose.yaml file
- Notes
- You can find example docker-compose.yaml configuration files in the 'docker/compose' directory
- The 'build' instruction/key-value (dictionary) is optional if you have performed multi-staged builds as recommended previously
- You can use this if you are intending to use the base image directly
version: 3.7 services: [programming-language]: image: author-name/docker-ide:[programming-language] container_name: dev-env-[programming-language] build: context: . dockerfile: docker/Dockerfiles/[base-distribution]/programming-languages/[programming-language].Dockerfile restart: unless-stopped working_dir: /projects ## Set current working directory stdin_open: true # Equivalent to '-i' in 'docker run -itd' tty: true # Equivalent to '-t' in 'docker run -itd' # ports: ## Port Forward/Translate/Map from host system to container ## [host-ip-address]:[host-system-port]:[container-port] volumes: ## Mount volumes from host system into container ## [host-system-volume]:[container-volume]:[permissions] - ${PWD}/projects/:/projects - ${HOME}/.config:${HOME}/.config
- Notes
- Build your base (stage 1) IDE docker image
-
Using docker run
- Build your base (stage 1) IDE docker image
docker build --tag=thanatisia/docker-ide:[base-distribution] \ -f docker/Dockerfiles/[base-distribution]/programming-languages/[language].Dockerfile \ .
- (Optional) Build all following stages 2 to N on top of your stage 1 docker image (Development Environment)
- Additional patch docker image templates (Dockerfiles)
docker build --tag=[author]/docker-ide:[tag|version] \ -f docker/Dockerfiles/[base-distribution]/add-on-images/[patch-name].Dockerfile \ .
- Frameworks
docker build --tag=[author]/docker-ide:[tag|version] \ -f docker/Dockerfiles/[base-distribution]/frameworks/[framework].Dockerfile \ .
- Additional patch docker image templates (Dockerfiles)
- Startup and run a new container using a target built image
docker run -itd \ --name=[container-name] \ --restart=unless-stopped \ --workdir="/projects" \ -v "${PWD}/projects:/projects" \ -v "${HOME}/.config/:${HOME}/.config/" \ [author-name]/docker-ide:[tag|version]
- Chroot and enter contaimer
docker exec -it [container-name] [shell]
- Build your base (stage 1) IDE docker image
-
(Optional) Add an alias mapping to the container's shell into your shell's resource control (rc) file for easy access
- Notes
- Useful for quick access to the development environment
alias enter_dev_env="docker exec -it [your-container-name] $SHELL"
- Notes
CONTEXT
: Specify the context (current working directory) of the host system when starting the build/run- Default: . (Current working directory)
STAGE_1_IMAGE_NAME
: Set the target name of the image to build- Default: thanatisia/docker-ide
STAGE_1_IMAGE_TAG
: Set the tag/version of the image to build- Default:
[base-distribution]
- Default:
STAGE_1_BUILD_ARGS
: Specify the build arguments to parse into the build process
STAGE_1_DOCKERFILE
: Specify the path to the custom Dockerfile to build- Default: 'docker/Dockerfiles/[base-distributions]/[language].Dockerfile'
NOTE: Please initialize a new set of the following for every build stages you require in your Makefile (i.e. N=2 for Build Stage 2, N=3 for Build Stage 3...) and add a new set of the 'build-stage-N' target
STAGE_N_IMAGE_NAME
: Set the target name of the image to build- Default: thanatisia/docker-ide
STAGE_N_IMAGE_TAG
: Set the tag/version of the image to build- Default: [programming-language]
STAGE_N_BUILD_ARGS
: Specify the build arguments to parse into the build process- Format:
--build-arg "ARGUMENT=VALUE"
- Format:
STAGE_N_DOCKERFILE
: Specify the path to the custom Dockerfile to build- Default: 'docker/Dockerfiles/[base-distributions]/add-on-images/nvim.Dockerfile'
CONTAINER_IMAGE_NAME
: Specify the docker image to startup the container with- Default: thanatisia/docker-ide
CONTAINER_IMAGE_TAG
: Specify the tag/version of the docker image you selected to startup the container with; Change this to switch between image versions if you are using multi-stage builds- Default: [programming-language]
CONTAINER_NAME
: Specify the name of the container to startup- Default: dev-env
CONTAINER_OPTS
: Specify all additional options to parse into the container startup process- Default Values:
--restart=unless-stopped
--workdir=/projects
- Other Options:
--user=${USER}
- Default Values:
CONTAINER_PORT_FORWARDING
: Port Forward/Translate/Map from host system to container;-p "[host-ip-address]:[host-system-port]:[container-port]"
CONTAINER_MOUNT_VOLUMES
: Mount Host System Volume;-v "[host-system-volume]:[container-volume]:[permissions]"
- Default Values:
- -v "${PWD}/projects/:/projects"
- -v "${HOME}/.config/:${HOME}/.config/"
- Default Values:
CONTAINER_PASSTHROUGH_DEVICE
: Passthrough a device/bus file from the host system to the container;--device "[host-system-device-file]:[container-mount-point]"
SERVER_USER_NAME
: Set the username of the server hosting the docker container instance you wish to connect toSERVER_IP_ADDRESS
: Set the IP address of the server hosting the docker instance you wish to access
SERVER_SHELL
: Set the shell to use to access the interactive tty of the container- Default: /bin/bash
- help : Display Help message
- build-stage-1 : Build Stage 1 image from multi-stage build
- build-stage-N : Build Stage N image from multi-stage build
- run : Startup a container from an image
- enter : Chroot and enter the container
- ssh : SSH and connect to the container from a remote host
- start : Start the container if stopped and exists
- stop : Stop the container if running
- restart : Restart the container if running
- remove : Remove the container if exists
- logs : Display logs of the container
-
Default Baseline
- Explanation
- -k : Keep executing even if error is encountered
make -k stop remove build-stage-1 run enter
- Explanation
-
Multi-stage Build
- Explanation
- the makefile will perform a docker build on the specified stage 1 Dockerfile (docker image template file) to build a stage 1 base image. Generally, this will be your primary IDE at its core
- then, makefile will build the stage 2 dockerfile templates that is built on top of the stage 1 images, followed by stage 3, which is built on top of stage 2
- This process will continue until the building of the stage N template which is based on the stage (N-1) Dockerfile
- On completion, the final product of the multi-staged build will be a docker image/environment with the features added by all the stages stacked on top of the Base (stage 1) Image
make build-stage-1 build-stage-2 ... build-stage-N
- Explanation
-
Connect and chroot to a remote docker server/session/instance
SERVER_USER_NAME=[your-target-username] \ SERVER_IP_ADDRESS=[your-target-server-ip|domain] \ SERVER_SHELL=[your-target-shell (default: /bin/bash)] \ make ssh
- root/
- README.md
- docker-compose.yaml : Main docker-compose environment script/file
- Makefile : Convenient make build file with targets/recipes to simplify running docker run
- docs/ : Contains documentation folders
- customization.md : Tips and Tricks for customizing your IDE before and after starting up your container
- framework-setup.md : Framework and Library Development Environment setup documentation
- language-setup.md : Programming Language Development Environment setup documentation
- project-environment-setup.md : Collection of Development Environment setup for general and Frequently-made project ideas
- makefiles/ : for holding Makefile templates for easy access to some frequently-used development environment usages (programming language, frameworks etc)
- c.Makefile : Makefile template pre-configured with C-focused docker image naming scheme; Can be edited
- py.Makefile : Makefile template pre-configured with Python-focused docker image naming scheme; Can be edited
- rust.Makefile : Makefile template pre-configured with Rust-focused docker image naming scheme; Can be edited
- frameworks/ : Contains Makefile templates pre-rconfigured for Framework/Library application development containers
- react-native.Makefile : Makefile template pre-configured for React Native development environment docker containers; Can be edited
- docker/ : Contains docker-based resources/source files
- compose/ : Holds all docker-compose template/example configuration files
- c.docker-compose.yaml : docker-compose.yaml file pre-configuredd with C-focused docker image naming scheme; Can be edited
- python.docker-compose.yaml : docker-compose.yaml file pre-configuredd with Python-focused docker image naming scheme; Can be edited
- rust.docker-compose.yaml : docker-compose.yaml file pre-configuredd with Rust-focused docker image naming scheme; Can be edited
- Dockerfiles/ : Contains all docker image templates (Dockerfile)
- agnostic/ : Contains distribution-agnostic/general dockerfile image patch files; Can be built on top of any built images (with pre-requisites)
- user-mgmt.Dockerfile : Installs and prepares User Management in the image
- alpine/ : The base image distribution of the dockerfile image template; This is using Alpine Linux
- add-on-images/ : Holds all alpine-related/apk-dependent patch Dockerfiles
- essential-packages.Dockerfile : Collection of essential packages in a single Dockerfile to patch to your base image
- nvim.Dockerfile : Clones and builds Neovim from Source to patch to your base image in a single Dockerfile
- environments/ : Holds the docker image templates for all General project development environments; This is using alpine (apk package manager) as the package management backend
- android-development.Dockerfile : Image Template for setting up a working Android mobile application development environment
- frameworks/ : Holds the docker image templates for all Framework/Library application development environments; This is using alpine (apk package manager) as the package management backend
- react-native.Dockerfile : Image Template for setting up a working React Native cross-platform framework mobile application development environment
- programming-languages/ : Holds the docker image templates for all Programming Languages development environments; This is using alpine (apk package manager) as the package management backend
- c.Dockerfile : Image Template for setting up a working C programming language development environment
- python.Dockerfile : Image Template for setting up a working Python scripting/programming language development environment
- rust.Dockerfile : Image Template for setting up a working Rust programming language development environment
- add-on-images/ : Holds all alpine-related/apk-dependent patch Dockerfiles
- archlinux/ : The base image distribution of the dockerfile image template; This is using ArchLinux
- add-on-images/ : Holds all archlinux-related/pacman-dependent patch Dockerfiles
- essential-packages.Dockerfile : Collection of essential packages in a single Dockerfile to patch to your base image
- nvim.Dockerfile : Clones and builds Neovim from Source to patch to your base image in a single Dockerfile
- environments/ : Holds the docker image templates for all General project development environments; This is using archlinux (pacman package manager) as the package management backend
- frameworks/ : Holds the docker image templates for all Framework/Library application development environments; This is using archlinux (pacman package manager) as the package management backend
- programming-languages/ : Holds the docker image templates for all Programming Languages development environments; This is using archlinux (pacman package manager) as the package management backend
- c.Dockerfile : Image Template for setting up a working C programming language development environment
- python.Dockerfile : Image Template for setting up a working Python scripting/programming language development environment
- rust.Dockerfile : Image Template for setting up a working Rust programming language development environment
- add-on-images/ : Holds all archlinux-related/pacman-dependent patch Dockerfiles
- debian/ : The base image distribution of the dockerfile image template; This is using Debian Linux
- add-on-images/ : Holds all debian-related/apt-dependent patch Dockerfiles
- essential-packages.Dockerfile : Collection of essential packages in a single Dockerfile to patch to your base image
- nvim.Dockerfile : Clones and builds Neovim from Source to patch to your base image in a single Dockerfile
- environments/ : Holds the docker image templates for all General project development environments; This is using debian (apt package manager) as the package management backend
- frameworks/ : Holds the docker image templates for all Framework/Library application development environments; This is using debian (apt package manager) as the package management backend
- programming-languages/ : Holds the docker image templates for all Programming Languages development environments; This is using debian (apt package manager) as the package management backend
- c.Dockerfile : Image Template for setting up a working C programming language development environment
- python.Dockerfile : Image Template for setting up a working Python scripting/programming language development environment
- rust.Dockerfile : Image Template for setting up a working Rust programming language development environment
- add-on-images/ : Holds all debian-related/apt-dependent patch Dockerfiles
- agnostic/ : Contains distribution-agnostic/general dockerfile image patch files; Can be built on top of any built images (with pre-requisites)
- compose/ : Holds all docker-compose template/example configuration files
- projects/ : This is the source directory that will be mounted into the container containing all your applications and projects; NOTE: This folder's contents are just suggestions and are not provided in the repository
- c/ : This contains your C programming language source files
- python/ : This contains your Python scripting/programming language source files
- rust/ : This contains your Rust programming language source files