Estudando Python encontrei um erro para executar o tkinter em um container Docker, a janela / front não é exibida. Sofri para entender o problema e conseguir configurar o container para executar interfaces gráficas (GUI) via Docker.
É necessário configurar o container para relacionar o monitor do computador com o monitor do container, semelhante ao que fazemos com os volumes e portas.
A configuração se aplica a qualquer aplicação com interface gráfica, inclusive programas Linux executados nos containers.
Muitas soluções disponíveis na internet dizem respeito a ambientes Linux. Um dos problemas que encontrei foi aplicar soluções válidas apenas para o Linux no Windows. Para facilitar, segue a solução para os dois sistemas, mas só testei no Windows.
Windows: configurar display com VcXsrv
Existem diversas soluções para configurar a propriedade display no Docker. A que me pareceu mais simples é a seguinte:
- Instalar o VcXsrv Windows X Server
Trata-se de um servidor para a execução de interfaces gráficas (GUI) de programas Linux executados em ambiente Windows. Fiz o download do instalador e concluí a instalação:
https://sourceforge.net/projects/vcxsrv/ - Configurar o VcXsrv
Executar o programa Xlaunch para configurar o VcXsrv. Mantive todas as opções padrão já preenchidas, com exceção da última tela de configuração [extra settings] no qual deve ser selecionada a caixa “disable access control”
- Salve a configuração antes de finalizar
Ao salvar o arquivo de configuração, por exemplo, na área de trabalho, nas próximas execuções do servidor VcXsrv basta clicar no arquivo salvo para iniciar o servidor.
- Execute o servidor VcXsrv
O ícone do servidor será exibido na barra de tarefas
- Altere o docker-compose
É possível construir novamente o container via linha de comando, mas prefiro utilizar o docker-compose. Somente 1 linha precisa ser acrescentada no arquivo:
environment:
- DISPLAY=host.docker.internal:0.0 - Rebuild o container
Execute novamente o container para processar a alteração no docker-compose.
Com isso será possível exibir as telas do Tkinter e outros programas com interface gráfica direto do container Docker de sua preferência.
Linux: configurar display
No caso do Linux, é necessário acrescentar as seguintes linhas no docker-compose:
volumes:
- '/tmp/.X11-unix:/tmp/.X11-unix'
environment:
- DISPLAY=unix$DISPLAY
No prompt do Linux, autorizar que todos os usuários tenham acesso ao x11:
$ sudo apt-get install x11-xserver-utils
$ xhost +
Por fim, efetuar o rebuild do container.
Saiba +
- Robin Kretzschmar. Run GUI app in linux docker container on windows host
- Kasper Schøn Henriksen. Empowering Docker using Tkinter GUI
- Somatório.org. Rodando aplicações GUI em Docker
- Stack overflow: docker _tkinter.TclError: couldn’t connect to display