Skip to content
69 changes: 69 additions & 0 deletions .devcontainer/Dockerfile
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

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

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

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

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

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
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
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
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

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

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/