Skip to content

Instantly share code, notes, and snippets.

@k33g
Created August 18, 2025 15:08
Show Gist options
  • Save k33g/49244e2264fda3f47832e6e1416fedce to your computer and use it in GitHub Desktop.
Save k33g/49244e2264fda3f47832e6e1416fedce to your computer and use it in GitHub Desktop.
Creating a Web IDE for a Python Project with Docker and Docker Compose

Run the script

PROJECTS_DIRECTORY="all-my-web-ides" \
WORKSPACE_NAME="demo-python-ide" \
KEY_NAME="github_perso" \
GIT_USER_EMAIL="[email protected]" \
GIT_USER_NAME="@bob" \
GIT_HOST="github.com" \
SOURCE_CODE_PROJECT_NAME="hello-world" \
./initialize-workspace.sh
services:
web-ide:
build:
context: .
dockerfile: Dockerfile
ports:
- 3000:3000
volumes:
- ./workspace:/home/workspace:cached
- ./keys:/home/openvscode-server/.ssh
- type: bind
source: /var/run/docker.sock
target: /var/run/docker.sock
init: true
restart: unless-stopped
FROM --platform=$BUILDPLATFORM gitpod/openvscode-server:latest
LABEL maintainer="@k33g_org"
ARG TARGETOS
ARG TARGETARCH
ARG USER_NAME=openvscode-server
USER root
# ------------------------------------
# Install Tools
# ------------------------------------
RUN <<EOF
apt-get update
apt-get install -y openssh-client curl wget git fonts-powerline
EOF
# ------------------------------------
# Install Python
# ------------------------------------
RUN <<EOF
apt-get update
apt-get install -y software-properties-common
add-apt-repository -y ppa:deadsnakes/ppa
apt-get update
apt-get install -y python3.9 python3.9-distutils python3.9-dev python3.9-venv
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.9
# Create symlinks
ln -sf /usr/bin/python3.9 /usr/bin/python3
ln -sf /usr/bin/python3.9 /usr/bin/python
ln -sf /usr/local/bin/pip3.9 /usr/local/bin/pip3
ln -sf /usr/local/bin/pip3.9 /usr/local/bin/pip
EOF
# ------------------------------------
# Install Docker
# ------------------------------------
RUN <<EOF
# Add Docker's official GPG key:
apt-get update
apt-get install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
EOF
RUN <<EOF
groupadd docker
usermod -aG docker ${USER_NAME}
newgrp docker
EOF
RUN adduser ${USER_NAME} docker
# Switch to the specified user
USER ${USER_NAME}
#!/bin/bash
: <<'COMMENT'
This script will create a workspace directory,
set up the necessary environment variables, and configure Git.
COMMENT
# --------------------------------------
# Initialize workspace
# --------------------------------------
mkdir -p ${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace
cat > "${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.bashrc" << 'EOF'
sudo chmod 666 /var/run/docker.sock
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
# Prompt avec couleurs
export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
EOF
echo "βœ… Workspace initialized with .bashrc"
# --------------------------------------
# Generate project.env
# --------------------------------------
echo "SSH_PUBLIC_KEY=\"$(cat $HOME/.ssh/${KEY_NAME}.pub)\"" > project.env
echo "SSH_PRIVATE_KEY=\"$(cat $HOME/.ssh/${KEY_NAME} | base64 -w 0)\"" >> project.env
echo "GIT_USER_EMAIL=${GIT_USER_EMAIL}" >> project.env
echo "GIT_USER_NAME=${GIT_USER_NAME}" >> project.env
echo "GIT_HOST=${GIT_HOST}" >> project.env
echo "βœ… project.env file created"
# --------------------------------------
# Git configuration
# --------------------------------------
# Check if project.env exists
if [ ! -f "project.env" ]; then
echo "❌ Error: project.env file not found"
exit 1
fi
source project.env
# Create keys directory if it doesn't exist
mkdir -p ${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys
USER_NAME=openvscode-server
PRIVATE_KEY_NAME=git_repository_key
PUBLIC_KEY_NAME=git_repository_key.pub
echo "πŸš€ Initializing the environment..."
echo "πŸ€— Configuring Git $USER_NAME"
if [ -f "./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.ssh/config" ]; then
echo "πŸ™‚ Git configuration already exists"
else
echo "πŸ“¦ Configuring git user"
echo "[user]" > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo " email = ${GIT_USER_EMAIL}" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo " name = ${GIT_USER_NAME}" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo "[safe]" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
#TODO: how to add the projects
#echo " directory = ./workspace/${PROJECT_NAME}" >> ./workspace/.gitconfig
echo "[http]" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo " postBuffer = 524288000" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo " lowSpeedLimit = 1000" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo " lowSpeedTime = 300" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo "[init]" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo " defaultBranch = main" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
chmod 644 ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig
echo "πŸ€— Configuring Git"
# ./workspace/keys maps on ./workspace/.ssh
echo "Host $GIT_HOST" > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config
echo " HostName $GIT_HOST" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config
echo " User git" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config
echo " IdentityFile ~/.ssh/$PRIVATE_KEY_NAME" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config
echo " StrictHostKeyChecking no" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config
chmod 600 ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config
# [[ ! -z $SSH_PUBLIC_KEY ]] &&
echo $SSH_PUBLIC_KEY > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/$PUBLIC_KEY_NAME
# [[ ! -z $SSH_PRIVATE_KEY ]] &&
echo $SSH_PRIVATE_KEY | base64 -d > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/$PRIVATE_KEY_NAME
chmod 600 ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/$PRIVATE_KEY_NAME
fi
# --------------------------------------
# Create a demo project
# --------------------------------------
mkdir -p ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/${SOURCE_CODE_PROJECT_NAME}
# create a README file
echo "# ${SOURCE_CODE_PROJECT_NAME}" > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/${SOURCE_CODE_PROJECT_NAME}/README.md
echo "This is a demo project for the web IDE." >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/${SOURCE_CODE_PROJECT_NAME}/README.md
# --------------------------------------
# Copy Dockerfile and Compose file
# --------------------------------------
cp -f ./Dockerfile ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/Dockerfile
cp -f ./compose.yml ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/compose.yml
echo "βœ… Dockerfile and compose files copied to workspace project"
# --------------------------------------
# Remove the project.env file
# --------------------------------------
rm -f project.env
echo "βœ… project.env file removed"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment