Apr 16, 2023

Using docker to play around with new C# features

Leia este post em português

Lire cet post en français.

In this post I presented sharplab.io, a fantastic tool that allows one to compile/run/reason about C# code, including using versions of the language that are under development but, even being a great resource it still has some limitations:

  1. In run mode, it has some restrictions on what can be executed or not (understandable, due to security concerns, resource utilization, etc)
  2. Being a website means you need an internet connection to use it (I know, I am being picky on this one).
  3. One have very little control over compiler options (like C# language version).
  4. No option to debug the code

So today I want to show you another tool in your toolbox to achieve a similar result: using Docker to experiment with new C# features without installing .NET preview versions locally or resorting to online compilers.

This post assumes you have at least basic experience with Docker (it don't require knowledge of any fancy feature though). Basically all you need to do is:

  1. Install Docker
  2. Pull latest nightly images from Microsoft repository:
    docker pull mcr.microsoft.com/dotnet/nightly/sdk:latest
  3. Run the container:
    docker run -it mcr.microsoft.com/dotnet/nightly/sdk /bin/bash

and you are done!  Once you run the command above you'll be in a terminal on a Doker container with the latest .NET build (as the time of this writing, .NET 8 Preview 4). 

Now you can experiment with new APIs, new features and what not. 

Of course you can always make your life easier. For instance, at the time of this writing, the downloaded image do not includes any reasonable text editor installed (sorry, vi fans, I am not that geek) and trying to install nano fails with a message stating that there's no candidate package for that application. Fixing it is pretty straightforward, requering just running apt update and  apt install nano but since I am lazy, my next logical step was to create a Dockerfile based on latest nightly images from MS adding the above commands:

And now you can build a custom image:

docker build . -t dotnet-latest 

docker run -it dotnet-latest

One important information you should be aware of if you are new to Docker is that container contents do not persist across sessions; this means that if you create/change any file in a session its contents will be lost when that session ends unless you take actions to persist them (unfortunately explaining how to do that is beyond the goals of this post but according to chatgpt, that is pretty straight forward - I've just entered the query "how to persist state across multiple docker sessions").

Have fun!

Usando docker para experimentar novas funcionalidades do C#

Read this post in English.

Lire cet post en français.

Neste post eu apresentei o sharplab.io, uma ferramenta fantástica que nos permite compilar/executar/avaliar código C#, incluindo versões da linguagem que ainda se encontram em desenvolvimento mas, como nenhuma ferramenta é perfeita, mesmo sendo um ótimo recurso o mesmo apresenta algumas limitações:

  1. No modo execução (run), o mesmo possui algumas restrições com relação ao código que pode ser executado ou não (que se devem a questões de segurança e de uso de recursos, ou seja, totalmente compreensível)
  2. Sendo um site web o mesmo exige uma conexão com a internet para ser usado(Ok, estou sendo um pouco chato neste ponto :)).
  3. Pouco ou quase inexistente controle sobre parâmetros usado para compilar o código (por exemplo, versão da linguagem C#, etc).
  4. Não é possível depurar o código

Assim sendo hoje eu quero apresentar uma nova maneira de atingir um resultado similar, sem as referidas restrições (mas certamente com outras :(): usar o Docker para experimentar novas funcionalidades  do C# sem ter que instalar versões preview do .NET localmente ou recorrer a compiladores online.

Este post assume uma experiência básica usando o Docker (mas o mesmo não requer conhecimento de nenhuma funcionalidade esotérica). Basicamente  tudo que precisamos fazer é:

  1. Instalar o Docker
  2. Baixar a imagem mais atualizada (nightly) do repositório Microsoft:
    docker pull mcr.microsoft.com/dotnet/nightly/sdk:latest
  3. Executar o container:
    docker run -it mcr.microsoft.com/dotnet/nightly/sdk /bin/bash

e pronto!  Uma vez que o comando 3 tenha sido executado você  estará em um  terminal (Linux) em um container  Doker com a versão de build noturno do  .NET (no momento em que escrevi este post,  .NET 8 Preview 4). Com isso você pode experimentar novas APIs, novas funcionalidades e muito mais.

Claro que sempre é possível tornar nossas vidas mais fáceis. Por exemplo, a versão atual da imagem que eu escolhi não possui um editor de texto razoável instalado (desculpe fans do vi, eu não sou tão geek assim) e um erro é reportado quanto tentamos instalar o nano. Corrigir este problema não é muito difícil requerendo apenas que executemos os comandos apt update e apt install nano; como eu sou preguiçoso o próximo passo foi automatizar este processo criando um arquivo Dockerfile baseado na imagem nightly da MS e adicionando os comandos citados acima para instalar o nano:

And now you can build a custom image:

docker build . -t dotnet-latest 

docker run -it dotnet-latest

Um ponto importante que você deve atentar caso não possua experiência usando o Docker é que o conteúdo de qualquer arquivo modificado durante a execução de um container é descartado assim que encerramos a execução do mesmo (infelizmente apresentar como persistir o conteúdo de tais arquivos esta além do objetivo deste post mas de acordo com o chatgpt, isso não é muito complicado - apenas entre a pergunta "como persistir arquivos entre sessões no docker?" e o mesmo responderá :)).

Have fun!

Utilisation de docker pour jouer avec les nouvelles fonctionnalités C#

Leia este post em português

Read this post in English.

Dans cet post j'ai présente sharplab.io, un outil fantastique qui nous permettre compiler/exécuter/raisonner  sur a pièce de code C# en utilisent des versions de la langage en cours de développement, mais, même s'il s'agit d'une excellente ressource, il a encore quelques limitations:

  1. En mode exécution, il y a certaines restrictions sur ce qui peut être et ce qui ne peut pas être exécuté (compréhensible, en raison de problèmes de sécurité, d'utilisation des ressources, etc.)
  2. Vous devez disposer d'une connexion Internet pour l'utiliser (Je sais, je suis picky sur celui-ci).
  3. On a très peu contrôle sur les options du compilateur (comme la version du langage C#).
  4. Pas d'option pour déboguer le code

Donc, aujourd'hui, je veux vous montrer un autre outil dans votre boîte à outils pour obtenir un résultat similaire : utiliser Docker pour expérimenter de nouvelles fonctionnalités C# sans installer les versions preview .NET localement ou recourir à des compilateurs en ligne.

Cet article suppose que vous avez au moins une expérience de base avec Docker (cela ne nécessite cependant aucune connaissance des fonctionnalités sophistiquées). En gros, tout ce que vous avez à faire est de :

  1. Installer Docker
  2. Extrayez les dernières images nocturnes du référentiel Microsoft :
    docker pull mcr.microsoft.com/dotnet/nightly/sdk:latest
  3. Exécutez le conteneur :
    docker run -it mcr.microsoft.com/dotnet/nightly/sdk /bin/bash

et vous avez terminé ! Une fois que vous avez exécuté la commande 3, vous serez dans un terminal sur un container Doker avec la dernière version de .NET (au moment de la rédaction de cet article, .NET 8 Preview 4).

Vous pouvez désormais expérimenter de nouvelles API, de nouvelles fonctionnalités, etc.

Bien sûr, vous pouvez toujours vous simplifier la vie. Par exemple, au moment d'écrire ces lignes, l'image téléchargée n'a pas d'éditeur de texte raisonnable installé (désolé, fans de vi, je ne suis pas si geek) et essayer d'installer nano échoue avec un message indiquant qu'il n'y a pas de package candidat pour cela application. Pour  réparer cet problème est assez simple, il vous suffit d'exécuter apt update, puis apt install nano mais comme je suis paresseux, ma prochaine étape logique consiste à créer un Dockerfile basé sur les dernières images nocturnes de MS ajouter mes propres commandes personnalisées:

Et maintenant, vous pouvez créer une image personnalisée:

docker build . -t dotnet-latest 

docker run -it dotnet-latest

Une information importante dont vous devez être conscient si vous débutez avec Docker est que le contenu du container ne persiste pas d'une session à l'autre ; cela signifie que si vous créez/modifiez un fichier dans une session, son contenu sera perdu à la fin de cette session, à moins que vous ne preniez des mesures pour les conserver (malheureusement, expliquer comment faire cela dépasse les objectifs de cet article, mais selon chatgpt, c'est assez simple - je viens d'entrer la requête "comment conserver l'état sur plusieurs sessions docker").

Amuse toi!