Mar
03
Encontrando “docker-compose.vs.debug.yml”

En mi aprendizaje sobre Docker con Visual Studio 2017 me he liado un poco con una cosa que finalmente resultó ser más sencillo de lo que parecía. A continuación escribo unas línas con la esperanza de que sirva de algo.

En el curso de Pluralsight “Introduction to Docker on Windows with Visual Studio 2017“, de Marcel de Vries, así como en otras publicaciones, como esta y esta, se ve cómo añadiendo soporte para docker en un projecto de Visual Studio 2017 aparecen los siguientes elementos en la solución:

  • Nuevo proyecto de Visual Studio llamado “docker-compose” con los siguientes archivos:
    • docker-compose.yml
    • docker-compose.override.yml
    • docker-compose.vs.debug.yml
    • docker-compose.vs.release.yml
  • Nuevos archivos dentro del proyecto al que se le ha añadido soporte para docker:
    • Dockerfile
    • .dockerignore

Los archivos “docker-compose.vs.debug.yml” y “docker-compose.vs.release.yml”, son muy útiles para definir características de los contenedore específicas para los entornos de desarollo y produción. Por ejemplo, puede ser interesante utilizar volúmenes (“volume”) para la carpeta del sitio web en IIS durante el desarrollo, facilitando la sobreescritura de archivos en esa fase, y posteriormente, cuando vamos a hacer un desplegado (“release”), la misma carpeta puede introducirse dentro del contenedor facilitando así su despliegue (“deployment”).

Al añadir soporte de Docker a una solución de VS existente, me sorprendió ver que los archivos “docker-compose.vs.debug.yml”, y “docker-compose.vs.release.yml” no se habían creado. La versión de Visual Studio 2017 utilizada era 15.5.7.

Por otro lado, en la ventana de salida (“Output”) de Visual Studio, al compilar el proyecto “docker-compose.dcproj” aparecía las siguientes líneas:

docker-compose -f “c:\Docker\Sitecore82TDS\docker-compose.yml” -f “c:\Docker\Sitecore82TDS\docker-compose.override.yml” -f “c:\Docker\Sitecore82TDS\obj\Docker\docker-compose.vs.debug.g.yml” -p dockercompose6697759991785308464 config

docker-compose -f “c:\Docker\Sitecore82TDS\docker-compose.yml” -f “c:\Docker\Sitecore82TDS\docker-compose.override.yml” -f “c:\Docker\Sitecore82TDS\obj\Docker\docker-compose.vs.debug.partial.g.yml” -p dockercompose6697759991785308464 kill
docker-compose -f “c:\Docker\Sitecore82TDS\docker-compose.yml” -f “c:\Docker\Sitecore82TDS\docker-compose.override.yml” -f “c:\Docker\Sitecore82TDS\obj\Docker\docker-compose.vs.debug.partial.g.yml” -p dockercompose6697759991785308464 down –rmi local –remove-orphans

Hay dos detalles en estas líneas que me confundieron:

  • Parecen indicar que VS2017 utiliza el nombre “docker-compose.vs.debug.partial.g.yml” o “docker-compose.vs.debug.g.yml” en lugar de “docker-compose.vs.debug.yml“.
  • La ubicación de ambos archivos es dentro de “obj/Docker”.

Inicialmente pensé que VS había cambiado el nombre del archivo y su ubicación. A demás, hay dos carpetas con la ruta “obj/Docker”. Una se crea dentro del proyecto original (donde se ha añadido soporte para Docker) y la otra es creada por VS a nivel raíz (donde está el archivo de la solución, *.sln). La utilizada por VS para generar el contenedor es la segunda, en la cual se pueden encontrar los siguientes archivos:

  • docker-compose.vs.debug.g.yml
  • docker-compose.vs.debug.partial.g.yml

Tras varias pruebas observé que VS genera ambos archivos en cada compilación (“Build”). Realmente, no se puede utilizar ninguno de ellos para añadir en los contenedores cambios especifícos de desarrollo.

Finalmente, la solución era la más sencialla posible. Simplemente hay que crear manualmente los archivos “docker-compose.vs.debug.yml”, y “docker-compose.vs.release.yml” dentro de la carpeta donde se encuentra el projecto “docker-compose.dcproj”. La mera existencia es suficiente para que VS detecte los archivos y los utilice, aunque yo prefiero añadirlos también al proyecto “docker-compose.dcproj”. Los pasos son los siguientes:

  1. Desde VS2017, hacer click derecho sobre el pryecto “docker-compose” y a continuación click sobre “Descargar Projecto” (“Unload Project”).
  2. De nuevo, click derecho sobre el proyecto “docker-compose” y en esta ocasión elegir “Editar ‘docker-compose.dcproj'”.
  3. Buscar las siguientes líneas en el archivo del proyecto:

    <ItemGroup>
    <None Include=”docker-compose.override.yml”>
    <DependentUpon>docker-compose.yml</DependentUpon>
    </None>
    <None Include=”docker-compose.yml” />
    </ItemGroup>

  4. Reemplazar las lineas anteriores por las siguientes:

    <ItemGroup>
    <None Include=”docker-compose.vs.debug.yml“>
    <DependentUpon>docker-compose.yml</DependentUpon>
    </None>
    <None Include=”docker-compose.vs.release.yml“>
    <DependentUpon>docker-compose.yml</DependentUpon>
    </None>
    <None Include=”docker-compose.override.yml”>
    <DependentUpon>docker-compose.yml</DependentUpon>
    </None>
    <None Include=”docker-compose.yml” />
    </ItemGroup>

  5. Guardar el archivo “docker-compose.dcproj” y cerrarlo.
  6. Crear dos archivos de texto llamados “docker-compose.vs.debug.yml”, y “docker-compose.vs.release.yml” en la misma carpeta donde está el proyecto “docker-compose.dcproj”.
  7. Desde VS2017, volver a cargar el proyecto “docker-compose” haciendo doble click sobre su nombre y eligiendo “Recargar Proyecto”.

Una vez hecho, VS detecta los nuevos archivos y directamente los utiliza como se puede ver en la siguiente línea tomada del la ventana de salida (“Output”) de VS:

docker-compose -f “c:\Docker\Sitecore82TDS\docker-compose.yml” -f “c:\Docker\Sitecore82TDS\docker-compose.override.yml” -f “c:\Docker\Sitecore82TDS\docker-compose.vs.debug.yml” -p dockercompose6697759991785308464 config