mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-13 17:22:15 -05:00
291 lines
12 KiB
Plaintext
291 lines
12 KiB
Plaintext
{
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"name": "python3",
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python"
|
|
},
|
|
"language_info": {
|
|
"name": "python",
|
|
"version": "3.8.10",
|
|
"mimetype": "text/x-python",
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"pygments_lexer": "ipython3",
|
|
"nbconvert_exporter": "python",
|
|
"file_extension": ".py"
|
|
}
|
|
},
|
|
"nbformat_minor": 2,
|
|
"nbformat": 4,
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"\n",
|
|
"## Deploy Azure SQL Edge container instance locally with Docker\n",
|
|
"This notebook will use Docker to pull and run the Azure SQL Edge image and connect to it in Azure Data Studio\n",
|
|
"\n",
|
|
"### Dependencies\n",
|
|
"- Docker Engine. For more information, see [Install Docker](https://docs.docker.com/engine/installation/).\n",
|
|
"\n",
|
|
"<span style=\"color:red\"><font size=\"3\">Please press the \"Run all\" button to run the notebook</font></span>"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "565693e5-39d7-46cf-b0a1-3aa9945c3eed"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### Check dependencies"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "b9e09157-54b4-4358-90a2-1a54419bd2cc"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"import sys,os,getpass,json,html,time\n",
|
|
"from string import Template\n",
|
|
"\n",
|
|
"def run_command(displayCommand = \"\"):\n",
|
|
" print(\"Executing: \" + (displayCommand if displayCommand != \"\" else cmd))\n",
|
|
" !{cmd}\n",
|
|
" if _exit_code != 0:\n",
|
|
" sys.exit(f'Command execution failed with exit code: {str(_exit_code)}.\\n')\n",
|
|
" print(f'Command successfully executed')\n",
|
|
"\n",
|
|
"cmd = 'docker version'\n",
|
|
"run_command()"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "a0a8cd9b-ab0f-4ba2-b568-0c68d950c8bf",
|
|
"tags": [
|
|
"hide_input"
|
|
],
|
|
"language": "python"
|
|
},
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### List existing containers\n",
|
|
"You can view the ports that have been used by existing containers"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "b5a3c41c-a2c3-44a7-94cc-9f1f61d0151d"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"cmd = f'docker ps -a'\n",
|
|
"run_command()"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "5a253372-1a98-4b07-a3e0-9ae5f47cb0a5",
|
|
"tags": [
|
|
"hide_input"
|
|
],
|
|
"language": "python"
|
|
},
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### Setting variables"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "7c476b13-05f7-4975-bcb0-8c596bc01e6c"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"env_var_flag = \"AZDATA_NB_VAR_SA_PASSWORD\" in os.environ\n",
|
|
"password_name = 'SQL Server sa account password'\n",
|
|
"if env_var_flag:\n",
|
|
" container_name = os.environ[\"AZDATA_NB_VAR_DOCKER_CONTAINER_NAME\"]\n",
|
|
" sql_password = os.environ[\"AZDATA_NB_VAR_SA_PASSWORD\"]\n",
|
|
" sql_port = os.environ[\"AZDATA_NB_VAR_DOCKER_PORT\"]\n",
|
|
" docker_registry = os.environ[\"AZDATA_NB_VAR_DOCKER_REGISTRY\"]\n",
|
|
" docker_repository = os.environ[\"AZDATA_NB_VAR_DOCKER_REPOSITORY\"]\n",
|
|
" docker_imagetag = os.environ[\"AZDATA_NB_VAR_DOCKER_IMAGETAG\"]\n",
|
|
" docker_username = os.environ[\"AZDATA_NB_VAR_DOCKER_USERNAME\"]\n",
|
|
" docker_password = os.environ[\"AZDATA_NB_VAR_DOCKER_PASSWORD\"]\n",
|
|
"else:\n",
|
|
" container_name = 'SQLEDGE-' + time.strftime(\"%Y%m%d%H%M%S\", time.localtime())\n",
|
|
" docker_registry = 'mcr.microsoft.com'\n",
|
|
" docker_repository = 'azure-sql-edge-developer'\n",
|
|
" docker_imagetag = 'latest'\n",
|
|
" docker_username = ''\n",
|
|
" docker_password = ''\n",
|
|
" sql_password = getpass.getpass(prompt = password_name)\n",
|
|
" password_confirm = getpass.getpass(prompt = f'Confirm {password_name}')\n",
|
|
" if sql_password != password_confirm:\n",
|
|
" sys.exit(f'{password_name} does not match the confirmation password.')\n",
|
|
" sql_port = input('SQL Server port, default value is 1433')\n",
|
|
" if len(sql_port) == 0:\n",
|
|
" sql_port = '1433'\n",
|
|
"print(f'{password_name}: ******')\n",
|
|
"print(f'Container name: {container_name}')\n",
|
|
"print(f'Port: {sql_port}')\n",
|
|
"print(f'Docker registry: {docker_registry}')\n",
|
|
"print(f'Docker repository: {docker_repository}')\n",
|
|
"print(f'Image tag: {docker_imagetag}')"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "c0af4e4e-4232-4a67-9a21-05a4d54fd0f4",
|
|
"tags": [
|
|
"hide_input"
|
|
],
|
|
"language": "python"
|
|
},
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### Pull the container image"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "92acb1bf-590d-426e-a9ee-2643c56dcdbe"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"if docker_username != '':\n",
|
|
" cmd = f'docker login {docker_registry} -u {docker_username} -p {docker_password}'\n",
|
|
" run_command(False)\n",
|
|
"cmd = f'docker pull {docker_registry}/{docker_repository}:{docker_imagetag}'\n",
|
|
"run_command()"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "58b2156b-da0c-47d5-9706-4bd9f630d28b",
|
|
"tags": [
|
|
"hide_input"
|
|
],
|
|
"language": "python"
|
|
},
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### Start a new container"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "442e71cd-551b-4b37-8b5a-b814efd27908"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"template = Template(f'docker run -e ACCEPT_EULA=Y -e \"SA_PASSWORD=$password\" -e \"MSSQL_PID=Developer\" -p {sql_port}:1433 --name {container_name} -d {docker_registry}/{docker_repository}:{docker_imagetag}')\n",
|
|
"cmd = template.substitute(password=sql_password)\n",
|
|
"run_command(template.substitute(password='******'))"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "4cdcf011-06fd-4df4-bd20-3024d0a5ab9d",
|
|
"tags": [
|
|
"hide_input"
|
|
],
|
|
"language": "python"
|
|
},
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### List all the containers"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "072a9d13-4fb1-4114-9637-5255be9fcc81"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"cmd = f'docker ps -a'\n",
|
|
"run_command()"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "345dc24f-0028-47b4-b35b-aaac047b7a62",
|
|
"tags": [
|
|
"hide_input"
|
|
],
|
|
"language": "python"
|
|
},
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### Connect to Azure SQL Edge instance in Azure Data Studio\n",
|
|
"It might take a couple minutes for the service to launch"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "c84bc075-f8b2-48a3-bfc7-f07a5b8be7a0"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"from IPython.display import *\n",
|
|
"connectionParameter = '{\"serverName\":\"localhost,' + sql_port + '\",\"providerName\":\"MSSQL\",\"authenticationType\":\"SqlLogin\",\"userName\":\"sa\",\"password\":' + json.dumps(sql_password) + ',\"options\": {\"trustServerCertificate\":true}}'\n",
|
|
"display(HTML('<br/><a href=\"command:azdata.connect?' + html.escape(connectionParameter)+'\"><font size=\"3\">Click here to connect to the Azure SQL Edge instance</font></a><br/>'))\n",
|
|
"display(HTML('<br/><span style=\"color:red\"><font size=\"2\">NOTE: The Azure SQL Edge instance password is included in this link, you may want to clear the results of this code cell before saving the notebook.</font></span>'))"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "187a0067-a04c-4afb-a684-3103bb4522ae",
|
|
"tags": [
|
|
"hide_input"
|
|
],
|
|
"language": "python"
|
|
},
|
|
"outputs": [],
|
|
"execution_count": null
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"### Stop and remove the container"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "94322968-02f5-49e5-8ff1-47a9af3c5e83"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"stop_container_command = f'docker stop {container_name}'\n",
|
|
"remove_container_command = f'docker rm {container_name}'\n",
|
|
"display(HTML(\"Use this link to: <a href=\\\"command:workbench.action.terminal.focus\\\">open the terminal window in Azure Data Studio</a> and use the links below to paste the command to the terminal.\"))\n",
|
|
"display(HTML(\"Stop the container: <a href=\\\"command:workbench.action.terminal.sendSequence?%7B%22text%22%3A%22\"+stop_container_command.replace(\" \",\"%20\")+\"%22%7D\\\">\" + stop_container_command + \"</a>\"))\n",
|
|
"display(HTML(\"Remove the container: <a href=\\\"command:workbench.action.terminal.sendSequence?%7B%22text%22%3A%22\"+remove_container_command.replace(\" \",\"%20\")+\"%22%7D\\\">\" + remove_container_command + \"</a>\"))"
|
|
],
|
|
"metadata": {
|
|
"azdata_cell_guid": "9b6c34c2-7a47-43f5-971d-ce9768fec587",
|
|
"tags": [
|
|
"hide_input"
|
|
],
|
|
"language": "python"
|
|
},
|
|
"outputs": [],
|
|
"execution_count": null
|
|
}
|
|
]
|
|
} |