.devcontainer for node
Another docker configuration for running node, compatible with vscode's remote containers plugin
This configuration has the advantage that no image building process is required (no Dockerfile):
.devcontainer/docker-compose.yml:
version: "3.4"
x-app: &app
  image: node:10.16.3
  volumes:
    - ..:/workspace:cached
    - node_modules:/workspace/node_modules
  environment:
    DATABASE_URL: postgres://postgres:postgres@postgres:5432
    DATABASE_USERNAME: postgres
    DATABASE_PASSWORD: postgres
  links:
    - postgres
services:
  bash:
    <<: *app
    command: /bin/bash -c "cd ./workspace && exec bash"
    ports:
      - 3000:3000
    volumes:
      - ..:/workspace:cached
      - node_modules:/workspace/node_modules
  vscode:
    <<: *app
    command: sleep infinity
volumes:
  node_modules:
And the vscode configuration:
.devcontainer/devcontainer.json:
// If you want to run as a non-root user in the container, see .devcontainer/docker-compose.yml.
{
  "name": "EQT Ticket Widget",
  "dockerComposeFile": "docker-compose.yml",
  "service": "vscode",
  "workspaceFolder": "/workspace",
  // Use 'settings' to set *default* container specific settings.json values on container create.
  // You can edit these settings after create using File > Preferences > Settings > Remote.
  "settings": {
    "terminal.integrated.shell.linux": "/bin/bash"
  },
  "runServices": [],
  // "shutdownAction": "none",
  //"postCreateCommand": "npm install",
  "extensions": ["dbaeumer.vscode-eslint"]
}
Usage #
I tend to use two package.json. One for the .devcontainer folder:
.devcontainer/package.json:
{
  "private": true,
  "scripts": {
    "bash": "docker-compose -p my-project-name --ports run bash"
  }
}
And another one in the root folder, with aliases to the most common used scripts:
/package.json:
{
  "scripts": {
    "docker:bash": "cd .devcontainer && npm run bash"
  }
}
🖖