devcontainers / devcontainers/templates

[go][bash][vscode-extensions] local cache and history persistence without volumes

Open
#124 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Shell
Stars
1.4k
Forks
393
Avg merge
2h 3m
Merged PRs (30d)
1

Description

Hello,

I find that in some case you may prefer to persist your build caches, bash history, etc... inside a local folder instead of inside a volume.

The following approach keeps a subset of cache or history in each project on the local disk.

## requirements:

* For this feature you will have to **mount your project inside your devcontanier at the same position as it is on your host**.
* This is mandatory to not lose the data if the devcontainer is rebuild.
* Thus, if the **devcontainer** is destroyed or rebuilt or if the docker volumes are removed the project specific build caches and bash history data will not be lost. They will still be

## use `onCreateCmd`:

Add the following in `.devcontainer/devcontainers.json`:

```json
"onCreateCommand": ".devcontainer/on-create-cmd.sh",
```

And now create a script `.devcontainer/on-create-cmd.sh`:

```bash
#!/bin/sh

set -e

sudo chmod o+rw /var/run/docker.sock

rm -rf ${HOME}/.bash_history
touch ${PWD}/.devcontainer/bash_history
ln -s ${PWD}/.devcontainer/bash_history ${HOME}/.bash_history

sudo rm -rf /go
mkdir -p ${PWD}/.devcontainer/go
sudo ln -s ${PWD}/.devcontainer/go /go

mkdir -p ~/.cache
sudo rm -rf ~/.cache/go-build
mkdir -p ${PWD}/.devcontainer/go-build-cache
sudo ln -s ${PWD}/.devcontainer/go-build-cache ~/.cache/go-build

# Vscode Remote-Container extension uses 'vscode-remote'
if [ -d ~/.vscode-server ] ; then
rm -rf ~/.vscode-server/extensions
mkdir -p ${PWD}/.devcontainer/vscode-extensions ~/.vscode-server
ln -s ${PWD}/.devcontainer/vscode-extensions ~/.vscode-server/extensions
fi

# Github Codespaces uses 'vscode-remote'
if [ -d ~/.vscode-remote ] ; then
rm -rf ~/.vscode-remote/extensions
mkdir -p ${PWD}/.devcontainer/vscode-extensions ~/.vscode-remote
ln -s ${PWD}/.devcontainer/vscode-extensions ~/.vscode-remote/extensions
fi
```

Do not forget to add execution rights for your script:

```bash
chmod +x .devcontainer/on-create-cmd.sh
```

## Result inside the devcontainer
image

### gitignore

As you can see now the project go build caches, vscode-extensions and bash history are generated inside the project path itself on your local disk.

I recommend that you finally add the following lines to `.devcontainer/.gitignore` to keep those file from versioning:

```gitignore
go
go-build-cache
bash_history
vscode-extensions
```

# Working example:

You can view a working example of this on one of my personal test project: https://github.com/7d4b9/utrade/tree/dev/.devcontainer

Just open a *Codespace* container directly on GitHub or checkout the project locally to use your host.

## Github Codespace

Keep in mind that here the persistence will occur in the current project checkout host. As it is a VM the data may be lost if this host is changed. However this is changing nothing as it is also the case if the data were kept inside a docker volume if the docker instance is renewed. So this is not a real warn, just an observation :)

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.