Les conteneurs de développement de VSCode, coder depuis docker

Pour éviter d'avoir à paramétrer et installer une base de donnée sur sa bécane et la configurer pour chaque application, il est possible d'utiliser docker pour ça. On peut aller plus loin et tout paqueter dans une image docker mais à ce moment là... ça peut commencer à coincer si l'on souhaite tester en condition sans avoir à build l'image à chaque fois, pour cela, la solution est sans doutes les devcontainers.

C'était introduit par Microsoft et l'entreprise quelques images avec des programmes pré-installés pour développer plus rapidement suivant les technologies: C#, Node, Python, etc.

Dans mon cas j'ai eu besoin d'avoir Python et Node pour deux services différents, je suis donc parti d'un compose avec deux services et pour ouvrir le conteneur de développement je vais sur charger l'un des deux et le rendre zombie.

Je vais partager une partie de mes fichiers de conf et plus tard partager un dépôt git certainement


⚠️
Requis
- Il ne faut pas oublier d'avoir un réseau interne en commun avec la DB pour communiquer avec.
- Il faut VSCode et le plugin Devcontainer

workspace/.devcontainer/devcontainer.json

{
	"name": "devcontainer",
	"dockerComposeFile": [
		"../docker-compose.yaml",
		"docker-compose.extend.yaml"
	],
	"workspaceFolder": "/usr/src",
	"service": "devcontainer"
}

workspace/compose.yml

services:
  db:
    ...
  service_node:
    ...
  service_python:
    ...

workspace/.devcontainer/Dockerfile

FROM debian:bullseye
USER root
RUN mkdir -p /usr/src/
WORKDIR /usr/src/
RUN apt-get update && apt-get install -y default-mysql-client
RUN apt-get install -y python3 python3-pip
RUN apt-get install -y npm
RUN apt-get install -y curl
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x
RUN apt-get update 
RUN apt-get install -y nodejs
RUN apt-get install -y git
RUN useradd -ms /bin/bash vscode
RUN mkdir -p /usr/src/app
RUN mkdir -p /usr/src/script
USER vscode
RUN echo 'alias python="python3"' >> /home/vscode/.bashrc
CMD /bin/sh -c "while sleep 1000; do:; done"

workspace/.devcontainer/compose.extend.yml

services:
  service_node:
    image: wolf/node
    build:
      context: .
      dockerfile: .devcontainer/Dockerfile
    ...
    volumes:
      - ./folder_node:/usr/src/app:cached
      - ./folder_python:/usr/src/script:cached
    command: /bin/sh -c "while sleep 1000; do :; done"
  service_python:
    image: alpine
    command: /bin/sh -c "while sleep 1000; do :; done"