Quiero crear una imagen de Docker que actúe como un ejecutable para el cual el usuario pasa un token como variable de entorno. El ejecutable tiene subcomandos que el usuario debe pasar a través de Dockers CMD (piense en git con autenticación a través de Env). Sin embargo, Docker no agrega la CMD al punto de entrada. La parte relevante de mi Dockerfile se ve así:
ENTRYPOINT ["/bin/sh", "-c", "/usr/bin/mycmd --token=$MY_TOKEN"] CMD ["pull", "stuff"]
Entonces, si este contenedor se ejecuta sin anulaciones de CMD y secret
como la variable MY_TOKEN, esperaría
mycmd --token=secret pull stuff
para ser ejecutado Si el usuario inicia el contenedor con una anulación, por ejemplo
docker run -it -e MY_TOKEN=secret myimage push junk
Yo esperaría
mycmd --token=secret push junk
para ser ejecutado Sin embargo, como se mencionó anteriormente, solo mycmd --token=secret
, el CMD se ignora, sin importar si lo anulo durante el inicio o lo configuro en el Dockerfile.
Con la sintaxis de /bin/sh -c "script"
, cualquier cosa después del argumento -c
se convierte en un argumento para su script. Puede comunicarse con ellos con $0
y $@
como parte de su secuencia de comandos /bin/sh:
ENTRYPOINT ["/bin/sh", "-c", "exec /usr/bin/mycmd --token=$MY_TOKEN $0 $@"] CMD ["pull", "stuff"]
Tenga en cuenta que también puede cambiar su punto de entrada para que sea un script de shell agregado a su imagen que ejecuta exec /usr/bin/mycmd --token=$MY_TOKEN "$@"
y ejecute ese script de shell con la sintaxis exec de docker:
ENTRYPOINT ["/entrypoint.sh"]
Como se especifica en la documentación de la ventana acoplable , está especificando un punto de entrada que llama a un shell (por lo tanto, no en el formulario de shell, sino en el exec). Los parámetros se pasan al shell (y por lo tanto se ignoran); solo importa el comando en el shell. Verá su problema resuelto después de cambiar su llamada de punto de entrada a:
ENTRYPOINT ["usr/bin/mycmd", "--token=$MY_TOKEN"]
Llamar a un shell en un punto de entrada es algo muy desaconsejado, y precisamente solo es útil cuando desea evitar que los usuarios de la imagen agreguen parámetros personalizados a su punto de entrada.
¡Nos vemos en las interwebs! :)