Skip to content

Commit 459c7c3

Browse files
authored
create workbench-jupyter-docker devcontainer to support docker workflows (#171)
* create workbench-jupyter-docker devcontainer to support docker workflows * lint * small comment
1 parent a6abf47 commit 459c7c3

File tree

5 files changed

+164
-0
lines changed

5 files changed

+164
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
{
2+
"name": "Workbench JupyterLab with docker support devcontainer template",
3+
"dockerComposeFile": "docker-compose.yaml",
4+
"service": "app",
5+
"shutdownAction": "none",
6+
"workspaceFolder": "/workspace",
7+
// Get the host's docker group ID and propagate it into the .env file, which
8+
// allows it to be used within docker-compose.yaml.
9+
"initializeCommand": "DOCKER_GID=`getent group docker | cut -d: -f3` && echo \"DOCKER_GID=${DOCKER_GID}\" > .env",
10+
"postCreateCommand": "./startupscript/post-startup.sh jupyter /home/jupyter ${templateOption:cloud} ${templateOption:login} && ./startupscript/setup-docker.sh",
11+
// re-mount bucket files on container start up
12+
"postStartCommand": [
13+
"./startupscript/remount-on-restart.sh",
14+
"jupyter",
15+
"/home/jupyter",
16+
"${templateOption:cloud}",
17+
"${templateOption:login}"
18+
],
19+
"remoteUser": "root",
20+
"customizations": {
21+
"workbench": {
22+
"opens": {
23+
"extensions": [
24+
// Source
25+
".ipynb",
26+
".R",
27+
".py",
28+
// Documents
29+
".md",
30+
".html",
31+
".latex",
32+
".pdf",
33+
// Images
34+
".bmp",
35+
".gif",
36+
".jpeg",
37+
".jpg",
38+
".png",
39+
".svg",
40+
// Data
41+
".csv",
42+
".tsv",
43+
".json",
44+
".vl"
45+
],
46+
"fileUrlSuffix": "/lab/tree/{path}",
47+
"folderUrlSuffix": "/lab/tree/{path}"
48+
}
49+
}
50+
}
51+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
# Custom Workbench JupyterLab App Template (workbench-jupyter-docker)
3+
4+
A template used to serve the Workbench custom JupyterLab app.
5+
6+
## Options
7+
8+
| Options Id | Description | Type | Default Value |
9+
|-----|-----|-----|-----|
10+
| cloud | VM cloud environment | string | gcp |
11+
| login | Whether to log in to workbench CLI | string | false |
12+
13+
14+
15+
---
16+
17+
_Note: This file was auto-generated from the [devcontainer-template.json](devcontainer-template.json). Add additional notes to a `NOTES.md`._
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"id": "custom-workbench-jupyter-template",
3+
"description": "A template used to serve the Workbench JupyterLab container image",
4+
"version": "0.0.1",
5+
"name": "Workbench Prebuilt JupyterLab Template",
6+
"documentationURL": "https://github.com/verily-src/workbench-app-devcontainers/tree/master/src/custom-workbench-jupyter-template",
7+
"licenseURL": "https://github.com/verily-src/workbench-app-devcontainers/blob/master/LICENSE",
8+
"options": {
9+
"cloud": {
10+
"type": "string",
11+
"description": "VM cloud environment",
12+
"proposals": ["gcp", "aws"],
13+
"default": "gcp"
14+
},
15+
"login": {
16+
"type": "string",
17+
"description": "Whether to log in to workbench CLI",
18+
"proposals": ["true", "false"],
19+
"default": "false"
20+
}
21+
},
22+
"platforms": ["Any"]
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
version: "2.4"
2+
services:
3+
app:
4+
container_name: "application-server"
5+
image: "us-central1-docker.pkg.dev/verily-workbench-public/apps/workbench-jupyter:latest"
6+
user: "jupyter:${DOCKER_GID}"
7+
restart: always
8+
volumes:
9+
- .:/workspace:cached
10+
# mount Host machine's docker.sock to container's docker.sock
11+
- /var/run/docker.sock:/var/run/docker.sock
12+
# mount Host machine's /etc/group to container's /etc/host-group
13+
- /etc/group:/etc/host-group
14+
# mount Host machine's default docker config dir to container's jupyter user docker config dir
15+
- /etc/docker:/home/jupyter/.docker
16+
ports:
17+
- "8888:8888"
18+
networks:
19+
- app-network
20+
cap_add:
21+
- SYS_ADMIN
22+
devices:
23+
- /dev/fuse
24+
security_opt:
25+
- apparmor:unconfined
26+
networks:
27+
app-network:
28+
external: true

startupscript/setup-docker.sh

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#!/bin/bash
2+
# setup-docker.sh
3+
# Installs the docker CLI and configure the host machine's docker group to
4+
# include the app container user.
5+
6+
set -o errexit
7+
set -o nounset
8+
set -o pipefail
9+
set -o xtrace
10+
11+
######################
12+
# Install Docker CLI #
13+
######################
14+
15+
mkdir -p /etc/apt/keyrings && \
16+
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \
17+
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
18+
19+
apt-get update && \
20+
apt-get install -y docker-ce-cli && \
21+
22+
###########################################
23+
# Add container user to host docker group #
24+
###########################################
25+
26+
# Add jupyter user to the host's docker group
27+
sed "/^docker:/ s/$/,jupyter/" /etc/host-group > /tmp/host-group.modified
28+
tee /etc/host-group < /tmp/host-group.modified > /dev/null
29+
30+
# create a matching docker group in the container and add the user to it
31+
DOCKER_GID=$(grep '^docker:' "/etc/host-group" | cut -d: -f3)
32+
if ! getent group docker; then
33+
groupadd -g "$DOCKER_GID" docker
34+
fi
35+
usermod -aG docker jupyter
36+
37+
###########################
38+
# Configuring docker auth #
39+
###########################
40+
41+
# Give user write permissions to the mounted docker config directory
42+
chown -R jupyter /home/jupyter/.docker
43+
44+
# Login to docker with gcloud credentials (needs to be re-run every 30 min if needed)
45+
sudo -u jupyter /bin/bash -c "docker login -u oauth2accesstoken -p $(gcloud auth print-access-token) https://us-central1-docker.pkg.dev"

0 commit comments

Comments
 (0)