Estoy escribiendo un Dockerfile para una imagen que, cuando se ejecuta, realiza las siguientes dos cosas en orden:
El problema es que ENTRYPOINT solo se puede ejecutar como un solo usuario (cualquier USUARIO que se establezca en último lugar antes de ENTRYPOINT en el Dockerfile). En este caso, ENTRYPOINT solo puede ejecutarse como usuario root o no root.
No puedo poner los comandos CMD antes de ENTRYPOINT, porque ENTRYPOINT simplemente los anula.
¿Cómo puedo lograr lo que necesito?
Inicia su contenedor como root. Esto ejecuta su punto de entrada como root. Realice todos los pasos que necesita, luego haga que el último paso se vea así:
exec gosu username /bin/bash Para iniciar /bin/bash como el nombre de usuario del username . Puedes encontrar gosu en este repositorio de github . Tiene la ventaja de ejecutar un comando su con un exec implícito que evita dejar el proceso principal alrededor del cual puede interrumpir el manejo de la señal.
Si hace que /bin/bash sea el valor de CMD, puede hacerlo más flexible con:
exec gosu username "$@"Asegúrese de usar la sintaxis json para ENTRYPOINT y CMD para evitar problemas con los comandos combinados y los argumentos cli.
Esto es preferible a sudo ya que evita cualquier opción para volver del usuario a la raíz.