How to (semi-)automatically sync local files with remote devcontainer?

Viewed 400

My Goal

I've been using devcontainers in combination with WSL2 for a little while now. But I keep running into issues and besides that I like off-loading resources of my laptop to a server. Moving the containers to a native Linux server would solve my issues.

My ideal situation would be to have a solution that works just like working locally on my Windows laptop (later probably moving to Macbook) but using the facilities of a Linux server (which has systemd and netns) and moving the workload there as well so my laptop doesn't sound like a vacuum cleaner.

My Journey

I'm trying to setup remote containers as described here: https://code.visualstudio.com/remote/advancedcontainers/develop-remote-host

Actually the containers are running fine, I'm using the second storage solution what means I add the following to my .devcontainer.json:

"workspaceMount": "source=/home/marvink/code,target=/workspaces,type=bind,consistency=cached"

And my workflow currently looks something like this:

  • Clone project locally (with .devcontainer already in the project)
  • Add workspaceMount above to devcontainer.json
  • Clone project on remote (e.g. to /home/marvink/code/new-project)
  • Open project locally
  • Build and reopen in container
  • Work on the files on the remote

My issue

This works but now I have files on my local drive that never get touched which isn't ideal but not a disaster, the bigger issue is when I want to update the devcontainer. I need to do that locally (in a seperate window), manually need to copy paste that to the remote if I want to commit it to git and off-course I sometimes forget this and try to edit it remotely which is causing a lot of frustration (and sometimes it seems like it does use the remote config, but that might have been a mistake?).

This is why I want to setup rsync both ways to sync changes to files and as a bonus I can edit files locally when I'm offline. In the link it's described how to do it manually but I want it automated so that I can't forget or make mistakes.

From Powershell I'm able to run an rsync command that syncs one-way and I can extend that to sync 2-way:

wsl rsync -rlptzv --progress --exclude=.git '$PWD' 'marvink@s-dev01:~/code/new-project'

This needs to be ran locally but I can't find a way to do that. I'd need to run a task locally for example, but that isn't possibly when working on a remote (https://github.com/microsoft/vscode-remote-release/issues/168).

The other way around doesn't seem like an option to me as I don't want to expose any ports on my laptop and firewalls would get in the way depending on where I am.

My question

My workflow still seems a bit convoluted so I'm open to suggestions on that end but any ideas on how to sync my workspace files?

1 Answers

You don't need a local version of your code (containing the .devcontainer folder) if you're storing that code on the remote server. You should be able to open an ssh target in VScode using the Remote - SSH extension, which is the recommended approach in the link you added. The extension Remote - Containers 'stacks' on top of the SSH extension, so once connected over SSH you then connect to the container using the .devcontainer.json configuration located on your remote server.

If you don't want to use the extension and use a bind mount + specify docker.host in your settings.json file, you can sync code using the approaches in that same article, through SSHFS, docker machine, or rsync.

Related