hub - dockerfile example
Dockerfile: $ HOME no funciona con las instrucciones ADD/COPY (1)
Aquí está tu problema:
Cuando utiliza la directiva USER
, afecta al ID de usuario utilizado para iniciar nuevos comandos dentro del contenedor. Así, por ejemplo, si haces esto:
FROM ubuntu:utopic
RUN useradd -m aptly
USER aptly
RUN echo $HOME
Usted obtiene esto:
Step 4 : RUN echo $HOME
---> Running in a5111bedf057
/home/aptly
Porque los comandos RUN
inician un nuevo shell dentro de un contenedor, que se modifica por la directiva USER
anterior.
Cuando utiliza la directiva COPY
, no está iniciando un proceso dentro del contenedor, y Docker no tiene forma de saber qué (si alguna) las variables de entorno serían expuestas por un shell.
Su mejor apuesta es establecer ENV HOME /home/aptly
aptly en su Dockerfile, que funcionará, o colocar sus archivos en una ubicación temporal y luego:
RUN cp /skeleton/myfile $HOME/myfile
Además, recuerde que cuando COPY
archivos serán propiedad de root
; Necesitarás explícitamente chown
al usuario apropiado.
Antes de presentar un error, me gustaría pedirle a alguien que confirme el extraño comportamiento de docker build
la ventana docker build
me he enfrentado recientemente.
Considere que tenemos un archivo Dock simple donde estamos tratando de copiar algunos archivos en el directorio de inicio de un usuario no root:
FROM ubuntu:utopic
ENV DEBIAN_FRONTEND=noninteractive
RUN sed -i.bak ''s/http:////archive.ubuntu.com//ubuntu///mirror:////mirrors.ubuntu.com//mirrors.txt///g'' /etc/apt/sources.list
RUN echo "deb http://repo.aptly.info/ squeeze main" >> /etc/apt/sources.list.d/_aptly.list
RUN apt-key adv --keyserver keys.gnupg.net --recv-keys e083a3782a194991
RUN apt-get update
RUN apt-get install -y aptly
RUN useradd -m aptly
RUN echo aptly:aptly | chpasswd
USER aptly
COPY ./.aptly.conf $HOME/.aptly.conf
COPY ./public.key $HOME/public.key
COPY ./signing.key $HOME/signing.key
RUN gpg --import $HOME/public.key $HOME/signing.key
RUN aptly repo create -comment=''MAILPAAS components'' -distribution=utopic -component=main mailpaas
CMD ["/usr/bin/aptly", "api", "serve"]
Eso es lo que obtengo cuando intento construir esta imagen:
...
Step 10 : USER aptly
---> Running in 8639f826420b
---> 3242919b2976
Removing intermediate container 8639f826420b
Step 11 : COPY ./.aptly.conf $HOME/.aptly.conf
---> bbda6e5b92df
Removing intermediate container 1313b12ca6c6
Step 12 : COPY ./public.key $HOME/public.key
---> 9a701a78d10d
Removing intermediate container 3a6e40b8593a
Step 13 : COPY ./signing.key $HOME/signing.key
---> 3d4eb847abe8
Removing intermediate container 5ed8cf52b810
Step 14 : RUN gpg --import $HOME/public.key $HOME/signing.key
---> Running in 6e481ec97f74
gpg: directory `/home/aptly/.gnupg'' created
gpg: new configuration file `/home/aptly/.gnupg/gpg.conf'' created
gpg: WARNING: options in `/home/aptly/.gnupg/gpg.conf'' are not yet active during this run
gpg: keyring `/home/aptly/.gnupg/secring.gpg'' created
gpg: keyring `/home/aptly/.gnupg/pubring.gpg'' created
gpg: can''t open `/home/aptly/public.key'': No such file or directory
gpg: can''t open `/home/aptly/signing.key'': No such file or directory
gpg: Total number processed: 0
Parece que $HOME
está vacío. ¿Pero por qué? No es muy conveniente colocar el camino absoluto hacia el directorio home en lugar de $HOME
.