¿Cuál es la diferencia entre el formulario shell y exec para
CMD :
CMD python my_script.py argcontra
CMD ["python", "my_script.py", "arg"] ENTRYPOINT :
ENTRYPOINT ./bin/maincontra
ENTRYPOINT ["./bin/main"] y RUN :
RUN npm startcontra
RUN ["npm", "start"] ¿Instrucciones Dockerfile ?
Hay dos diferencias entre el formulario shell y el formulario exec. De acuerdo con la documentación , el formulario exec es el formulario preferido. Estas son las dos diferencias:
El formulario exec se analiza como una matriz JSON, lo que significa que debe usar comillas dobles (") alrededor de las palabras, no comillas simples (').
A diferencia del formulario de shell, el formulario exec no invoca un shell de comandos. Esto significa que el procesamiento de shell normal no ocurre. Por ejemplo, CMD [ "echo", "$HOME" ] no realizará la sustitución de variables en $HOME. Si desea un procesamiento de shell, utilice el formulario de shell o ejecute un shell directamente, por ejemplo: CMD [ "sh", "-c", "echo $HOME"]. Cuando se usa el formulario exec y se ejecuta un shell directamente, como en el caso del formulario de shell, es el shell el que realiza la expansión de la variable de entorno, no Docker.
Algunas sutilezas adicionales aquí son:
El formulario exec hace posible evitar la manipulación de cadenas de shell y EJECUTAR comandos utilizando una imagen base que no contiene el ejecutable de shell especificado.
En el formulario de shell, puede usar una \ (barra invertida) para continuar con una sola instrucción RUN en la siguiente línea.
También hay una tercera forma para CMD :
CMD ["param1","param2"] (como parámetros predeterminados para ENTRYPOINT)
Además, se requiere el formulario exec para CMD si lo está utilizando como parámetros/argumentos para ENTRYPOINT que están destinados a sobrescribirse.