Inicializar el volumen en la location especificada por el usuario

He estado tratando de leer sobre los volúmenes de Docker desde hace un time, pero todavía parece que falta algo.

Toma este Dockerfile : (tomado de documentos)

 FROM ubuntu RUN mkdir /myvol RUN echo "hello world" > /myvol/greeting VOLUME /myvol 

Si construyo y ejecuto esto simplemente como docker run <img> , entonces se crea un nuevo volumen (se puede encontrar su nombre usando docker inspect <containerid> ). El contenido de /var/lib/docker/volumes/<volumeid> es solo un greeting file que contiene hello world , como se esperaba.

Hasta aquí todo bien. Ahora, supongamos que quería, como usuario, colocar este volumen en una location personalizada. Me gustaría ejecutar docker run -v /host/path/:/myvol . Esto ya no funciona. /host/path se crea (si no existe), pero está vacío.

Entonces, la pregunta es, ¿cómo coloco algunos files en un Volumen en Dockerfile, mientras le permito al usuario elegir dónde colocan este volumen? Esta me parece ser una de las razones para usar la directiva Volume en primer lugar.

Entonces, la pregunta es, ¿cómo coloco algunos files en un Volumen en Dockerfile, mientras le permito al usuario elegir dónde colocan este volumen?

Tu no Se crea un volumen en time de ejecución , mientras que su file Docker se consulta en time de compilation .

Si desea poder rellenar previamente un volumen en una location arbitraria cuando se ejecuta su contenedor, permita que el usuario proporcione la ruta al volumen en una variable de entorno y luego tenga un script ENTRYPOINT que copie los files en el volumen cuando el el contenedor comienza

Una alternativa es requerir el uso de una ruta específica, y luego aprovechar el hecho de que si el usuario monta un nuevo volumen vacío en esa ruta, Docker copyrá el contenido de ese directory en el volumen. Por ejemplo, si tengo:

 FROM alpine RUN mkdir /data; echo "This is a test" > /data/datafile VOLUME /data 

Y construyo una image testimage partir de eso, y luego ejecuto:

 docker run -it testimage sh 

Veo que mi volumen /data contiene los files del sistema de files subyacente:

 / # ls /data datafile 

Esto no funcionará si marco una ruta de host en esa location, por ejemplo si lo hago:

 host# mkdir /tmp/empty host# docker run -it -v /tmp/empty:/data testimage sh 

Entonces la ruta resultante estará vacía:

 / # ls /data / # 

Esta es otra situación en la que una ENTRYPOINT commands ENTRYPOINT podría usarse para llenar el directory de destino.