Dockerfile: $HOME не работает с инструкциями ADD/COPY
Прежде чем подавать ошибку, я хотел бы попросить кого-нибудь подтвердить странное поведение docker build
, с которым я столкнулся недавно.
У нас есть простой файл Docker, где мы пытаемся скопировать некоторые файлы в домашний каталог пользователя без полномочий 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"]
Что я получаю, когда пытаюсь создать это изображение:
...
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
Кажется, что $HOME
пуст. Но почему? Ввод абсолютного пути в домашний каталог вместо $HOME
не очень удобен.
Ответы
Ответ 1
Вот ваша проблема:
Когда вы используете директиву USER
, это влияет на идентификатор пользователя, используемый для запуска новых команд внутри контейнера. Так, например, если вы это сделаете:
FROM ubuntu:utopic
RUN useradd -m aptly
USER aptly
RUN echo $HOME
Вы получаете следующее:
Step 4 : RUN echo $HOME
---> Running in a5111bedf057
/home/aptly
Поскольку команды RUN
запускают новую оболочку внутри контейнера, которая модифицируется предыдущей директивой USER
.
Когда вы используете директиву COPY
, вы не запускаете процесс внутри контейнера, а Docker не имеет возможности узнать, какие (если есть) переменные среды будут открываться оболочкой.
Лучше всего либо установить ENV HOME /home/aptly
в свой файл Docker, который будет работать, либо разложить ваши файлы во временное место, а затем:
RUN cp /skeleton/myfile $HOME/myfile
Также помните, что когда вы COPY
файлы в них будут принадлежать root
; вам нужно явно указать chown
их соответствующему пользователю.