Imagen de Docker para ejecutar Visual Studio Code




Presentación


En el presente proyecto se desarrolla la construcción y el uso de una imagen de docker para ejecutar el Visual Studio Code, el objetivo es tener totas la aplicaciones instaladas en contenedores aislados de tal modo que sólo se habilitan cuando se usan y de ser necesario se puedan eliminar totalmente o trasladar a otro equipo


Construccion de la imagen docker

Para la construcción de la imagen usaremos un archivp Dockerfile y un archivo start.sh que se ven a continuación:

El siguiente es el archivo Dockerfile:


    # Usar la imagen oficial de Python como base
    FROM python:3.12-slim
    
    # Definir el usuario y el grupo
    ARG USER=operador
    ARG UID=1000
    ARG GID=1000
    
    # Crear grupo y usuario sin privilegios
    RUN groupadd --gid $GID $USER && \
        useradd --uid $UID --gid $GID --create-home --shell /bin/bash $USER && \
        usermod -aG dialout $USER  # Agregar al grupo dialout
    
    # Crear el directorio de trabajo y asignarle permisos
    WORKDIR /app
    RUN chown -R $USER:$USER /app
    
    # Instalar dependencias
    RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
        curl \
        tk \
        python3-tk \
        xvfb \
        openssh-server \
        sudo \
        gnupg2 \
        && curl -sSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg \
        && echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list \
        && apt-get update \
        && apt-get install -y code \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*
    
    # Configurar SSH
    RUN mkdir -p /var/run/sshd
    RUN echo 'root:password' | chpasswd
    RUN echo 'operador:password' | chpasswd
    RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
    RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
    
    # Permitir que el usuario operador ejecute sudo sin contraseña
    RUN echo "$USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
    
    # Exponer el puerto SSH
    EXPOSE 22
    
    # Configurar X11 Forwarding (para Visual Studio Code)
    ENV DISPLAY=host.docker.internal:0
    ENV XAUTHORITY=/home/$USER/.Xauthority
    
    # Copiar el script start.sh y cambiar permisos (como root)
    COPY start.sh /home/$USER/start.sh
    RUN chown $USER:$USER /home/$USER/start.sh && \
        chmod +x /home/$USER/start.sh
    
    # Cambiar al usuario no root
    USER $USER
    
    # Comando de inicio
    CMD ["/home/operador/start.sh"]
  

El siguiente es el archivo start.sh:


    #!/bin/bash

    # Iniciar el servidor SSH
    sudo service ssh start
    
    # Iniciar Visual Studio Code (usando X11 forwarding)
    code --no-sandbox --user-data-dir=/home/operador/vscode-data
          
  

Ambos archivos dberan estar en la misma carpeta de modo que quedecon la siguiente estructura de archivos:

A continuación debemos abrir una terminal en la carpeta donde se encuentran los archivos y construimos la imagen ejecutando el siguiente comando (cabe aclarar que debemos tener el Docker instalado y configurado).


    docker build -t img_vstudio .
  

Sobre la linea de comando anterior caben dos observaciones: el nombre de la imagen img_vstudio puede ser ese o el que ustedes deseen, pero si lo cambian recuerden de modificar las instruciones que usaremos a continuacion. Y en segundo lugar no olvidarse del punto al final de la linea que debe ir siempre y separado con un espacio despues del nombre.

Si todo ha salido bien veremos lo siguiente en la terminal:

Puesta en marcha contenedor docker

Antes de iniciar el contenedor debemos habilitarlo a acceder al servidor gráfico X11 con siguiente comando: ( de tener otro servidor grafico aegurarse que el contenedor tenga acceso al mismo)


    xhost +local:docker
  

A continuacion debemos iniciar el contenedor y lanzar el Visual Studio Code, lo que haremos ejecutando el siguiente comando:


    docker run -d --name cont_vstudio \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=$DISPLAY \
    -v $HOME/.Xauthority:/home/operador/.Xauthority:ro \
    -p 2222:22 \
    img_vstudio
  

Aca tambien cabe considerar que el nombre colocado después de --name es el del contenedor y pueden modificarlo a su gusto, pero el del final img_vstudio debe ser necesariamente igual al que le hayan dado a la imagen en el paso anterior

Si todo ha salido bien veremos la ventana de ejecucion del Visual Studio Code donde podremos empezar a configurarlo a nuestro gusto.

Detención y puesta en marcha del contenedor Docker

Es una buena práctica detener el contenedor que lo haremos con el siguiente comando teniendo siempre en cuenta que debemos nombrar el contenedor por el nombre que le asignamos al crearlo, en nuestro caso la sintaxis es:


    docker stop cont_vstudio
  

Cuando queramos volver a utilizarlo lo arrancaremos con el siguiente comando teniendo siempre en cuenta que debemos nombrar el contenedor por el nombre que le asignamos al crearlo y que la placa debe estar conectada al puerto /dev/ttyUSB0 o al que le hayamos asignado al poner en marcha el contenedor la primera vez, en nuestro caso la sintaxis es:


    docker start cont_vstudio
  

Conexion al contenedor

Este contenedor cuenta con un servidor ssh que nos permite acceder a su contenido para poder subir al mismo archivos de programas o para bajarlos a nuestra computadora

Para acceder al servidor shh simmplemete usamos el siguiente comando desde una terminal:


    ssh -v -p 2222 operador@localhost
  

A continuacion ingresamos cuando nos pide la clave ingresamos "password" que es la predefinida en el Dockerfile si queremos modificarla debemos cambiarla en el mismo y realizar tot el proceso de creacion de imagen de nuevo y veremos los siguiente en la terminal:

Ahi podemos subir y bajar archivos del contenedor con los camndos de la terminal, tambien es posible agregarlo al nautilus como un servidor para acceder a traves del mismo.

La imagen de este proyecto se puede descargar desde Docker Hub


Cerrar