¿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.
davy.ai
Solución:
Para guardar literalmente todo el comando en la variable
mycommand
, podemos rodearlo de comillas simples en lugar de comillas dobles.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.
${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í:Y el comando para ejecutarlo sería:
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.