es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo enviar un comando correctamente a un contenedor de Docker?

Puedo ejecutar el siguiente comando en mi terminal correctamente.
comando:

gdalwarp -s_srs "+datum=WGS84 +no_defs +geoidgrids=egm96-15.gtx" -t_srs "+datum=WGS84 +no_def" input.tif output.tif

Ahora quiero almacenar este comando en una variable y expandirlo dentro de un contenedor Docker.

Mi script run.sh se ve así. Primero almaceno mi comando objetivo en mycommand y luego ejecuto el contenedor con el comando como entrada.

mycommand=$@;
docker run -ti --rm osgeo/gdal:ubuntu-small-latest /bin/bash -c "cd $(pwd); ${mycommand}"

Luego, ejecuto run.sh de la siguiente manera.

bash run.sh gdalwarp -s_srs "+datum=WGS84 +no_defs +geoidgrids=egm96-15.gtx" -t_srs "+datum=WGS84 +no_def" input.tif output.tif

Problema:
1. Esperaba que todo después de bash run.sh se almacenara literalmente en la variable mycommand.
2. Dentro del contenedor Docker, se debería expandir y ejecutar literalmente el mycommand. Pero parece que las comillas dobles en mi comando original se pierden durante este proceso.

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Para guardar literalmente todo el comando en la variable mycommand, podemos rodearlo de comillas simples en lugar de comillas dobles.

    mycommand='$@';
    

    Esto asegurará que los caracteres especiales, como las comillas dobles, no sean expandidos o interpretados por el shell.

    Para preservar las comillas dobles dentro del contenedor de Docker, podemos usar barras invertidas para escaparlas.

    docker run -ti --rm osgeo/gdal:ubuntu-small-latest /bin/bash -c "cd $(pwd); ${mycommand//\"/\\\"}"
    

    ${mycommand//\"/\\\"} reemplazará todas las comillas dobles por comillas dobles escapadas, asegurando que se preserven dentro del contenedor.

    Con estos cambios, el archivo run.sh debería lucir así:

    mycommand='$@';
    docker run -ti --rm osgeo/gdal:ubuntu-small-latest /bin/bash -c "cd $(pwd); ${mycommand//\"/\\\"}"
    

    Y el comando para ejecutarlo sería:

    bash run.sh gdalwarp -s_srs "+datum=WGS84 +no_defs +geoidgrids=egm96-15.gtx" -t_srs "+datum=WGS84 +no_def" input.tif output.tif
    

    Ten en cuenta que las comillas dobles dentro de los argumentos del comando gdalwarp ahora están escapadas con barras invertidas para asegurar que se preserven.

Comments are closed.