Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

CHORE: Create devcontainer for repo #147

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
saurabh500 wants to merge 12 commits into microsoft:main
base: main
Choose a base branch
Loading
from saurabh500:devcontainer
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
12 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions .devcontainer/Dockerfile
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Use Python 3.10 with Debian Bullseye as the base image
FROM mcr.microsoft.com/devcontainers/python:3.10-bullseye

# Set environment variables
ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONPATH=/workspaces/mssql-python
ENV CMAKE_BUILD_TYPE=Debug

# Install system dependencies
RUN apt-get update && apt-get install -y \
# Build tools
build-essential \
cmake \
pkg-config \
ninja-build \
# Additional tools
curl \
Copy link
Collaborator

@bewithgaurav bewithgaurav Jul 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the pre-installations are part of the post-create script as well.. just checking, can we maybe remove things from either here or post-create? there might be any redundancies which can add to build time

Copy link
Author

@saurabh500 saurabh500 Jul 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. I will remove the redundant dependencies from Post-create.
The idea is to install the system utils like curl/wget in Dockerfile and keep python / project specific installation in post-create.sh

bewithgaurav reacted with thumbs up emoji
wget \
git \
vim \
nano \
htop \
tree \
jq \
# Clean up
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

# Install Microsoft ODBC Driver for SQL Server
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update \
&& ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
Copy link
Collaborator

@bewithgaurav bewithgaurav Jul 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same for odbc installation

&& ACCEPT_EULA=Y apt-get install -y mssql-tools18 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

# Add mssql-tools to PATH
ENV PATH="$PATH:/opt/mssql-tools18/bin"

# Upgrade pip and install common Python development tools
RUN python -m pip install --upgrade pip setuptools wheel \
&& pip install \
black \
Copy link
Collaborator

@bewithgaurav bewithgaurav Jul 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have the minimum requirements available in requirements.txt - as seen in post-create script we're using pip install -r requirements.txt already. we can skip this here/there probably.

flake8 \
mypy \
isort \
pre-commit \
twine \
build \
wheel \
"pybind11[global]" \
pytest-xdist \
pytest-mock \
"coverage[toml]"

# Set the default user to vscode (created by the base image)
USER vscode

# Set the working directory
WORKDIR /workspaces/mssql-python

# Add helpful aliases to .bashrc
RUN echo 'alias ll="ls -alF"' >> ~/.bashrc \
&& echo 'alias la="ls -A"' >> ~/.bashrc \
&& echo 'alias l="ls -CF"' >> ~/.bashrc

# Default command
CMD ["/bin/bash"]
76 changes: 76 additions & 0 deletions .devcontainer/devcontainer.json
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
{
"name": "MSSQL Python Driver",
"build": {
"dockerfile": "Dockerfile",
"context": "."
},
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Set *default* container specific settings.json values on container create.
"settings": {
"python.defaultInterpreterPath": "/usr/local/bin/python",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
"python.linting.banditPath": "/usr/local/py-utils/bin/bandit",
"python.linting.flake8Path": "/usr/local/py-utils/bin/flake8",
"python.linting.mypyPath": "/usr/local/py-utils/bin/mypy",
"python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle",
"python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle",
"python.linting.pylintPath": "/usr/local/py-utils/bin/pylint",
"cmake.configureOnOpen": false
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"ms-python.pylint",
"ms-toolsai.jupyter",
"ms-vscode.cmake-tools",
"ms-vscode.cpptools",
"ms-vscode.cpptools-extension-pack",
"github.copilot",
"github.copilot-chat",
"ms-vscode.test-adapter-converter",
"littlefoxteam.vscode-python-test-adapter",
"ms-azuretools.vscode-docker",
"ms-mssql.mssql"
]
}
},
// Features to add to the dev container. More info: https://containers.dev/features.
"features": {
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": true,
"configureZshAsDefaultShell": true,
"installOhMyZsh": true,
"upgradePackages": true,
"username": "vscode",
"userUid": "automatic",
"userGid": "automatic"
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "bash .devcontainer/post-create.sh",
// Use 'postStartCommand' to run commands after the container starts.
"postStartCommand": "",
// Configure tool-specific properties.
"remoteUser": "vscode",
// Set container environment variables
"containerEnv": {
"PYTHONPATH": "/workspaces/mssql-python",
"CMAKE_BUILD_TYPE": "Debug"
},
// Mount the project directory
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mssql-python,type=bind,consistency=cached",
"workspaceFolder": "/workspaces/mssql-python"
}
85 changes: 85 additions & 0 deletions .devcontainer/post-create.sh
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#!/bin/bash

# Post-create script for MSSQL Python Driver devcontainer
set -e

echo "🚀 Setting up MSSQL Python Driver development environment..."

# Update package lists
echo "📦 Updating package lists..."
sudo apt-get update

# Install system dependencies required for the project
echo "🔧 Installing system dependencies..."
sudo apt-get install -y \
python3 \
python3-pip \
python3-venv \
python3-full \
cmake \
curl \
wget \
gnupg \
software-properties-common \
build-essential \
python3-dev \
pybind11-dev

export TZ=UTC
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Install Microsoft ODBC Driver for SQL Server (required for mssql connectivity)
echo "🗄️ Installing Microsoft ODBC Driver for SQL Server..."
curl -sSL -O https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb || true
rm packages-microsoft-prod.deb

sudo apt-get update
# Install the driver
ACCEPT_EULA=Y sudo apt-get install -y msodbcsql18
# optional: for bcp and sqlcmd
ACCEPT_EULA=Y sudo apt-get install -y mssql-tools18
# optional: for unixODBC development headers
sudo apt-get install -y unixodbc-dev

# Create a Python virtual environment
echo "🐍 Creating Python virtual environment..."
python3 -m venv /workspaces/mssql-python/opt/venv
source /workspaces/mssql-python/opt/venv/bin/activate

python -m pip install --upgrade pip

# Make the virtual environment globally available
echo 'source /workspaces/mssql-python/opt/venv/bin/activate' >> ~/.bashrc

# Install project dependencies
echo "📚 Installing project dependencies..."
pip install -r requirements.txt

# Create useful aliases
echo "⚡ Setting up aliases..."
cat >> ~/.bashrc << 'EOF'

# MSSQL Python Driver aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias clean='find . -type f -name "*.pyc" -delete && find . -type d -name "__pycache__" -delete'

EOF

# Set up git configuration (if not already configured)
echo "🔧 Configuring git..."
if [ -z "$(git config --global user.name)" ]; then
echo "Git user name not set. You may want to configure it with:"
echo " git config --global user.name 'Your Name'"
fi
if [ -z "$(git config --global user.email)" ]; then
echo "Git user email not set. You may want to configure it with:"
echo " git config --global user.email 'your.email@example.com'"
fi

# Display information about the environment
echo ""
echo "✅ Development environment setup complete!"

115 changes: 115 additions & 0 deletions .dockerignore
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
# Git
.git
.gitignore
.gitattributes

# Python
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env
pip-log.txt
pip-delete-this-directory.txt
.tox
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.log
.mypy_cache
.pytest_cache
.hypothesis

# Distribution / packaging
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
Copy link
Collaborator

@bewithgaurav bewithgaurav Jul 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

safer to remove lib/ from here as well since lib dirs are present inside odbc directory

lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
*.manifest
*.spec

# Installer logs
pip-log.txt

# Unit test / coverage reports
htmlcov/
.coverage
.coverage.*
nosetests.xml
coverage.xml
*.cover
.hypothesis/

# Translations
*.mo
*.pot

# Documentation
docs/_build/

# PyBuilder
target/

# IDEs
.vscode/
.idea/
*.swp
*.swo
*~

# OS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Temporary files
*.tmp
*.temp
*.log

# Node.js (if any)
node_modules/
npm-debug.log*

# CMake
CMakeCache.txt
CMakeFiles/
cmake_install.cmake
Makefile
*.cmake

# Build artifacts
*.so
Copy link
Collaborator

@bewithgaurav bewithgaurav Jul 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the .so files for linux odbc, .dylib files for macos odbc and .dll files for windows odbc are needed for build and execution. putting this in gitignore will skip them and remove that from build context. we might need to remove these files from dockerignore.

*.dll
*.dylib
*.pdb
*.obj
*.exe

# Test results
test-results/
.pytest_cache/

# Azure DevOps
.azure/

AltStyle によって変換されたページ (->オリジナル) /