Особенность использования переменных окружения в docker

FROM golang:1.15.5
ADD ./id_rsa $HOME/.ssh/id_rsa
ADD ./.gitconfig $HOME/.gitconfig
RUN chmod 700 $HOME/.ssh/
RUN chmod 700 $HOME/.ssh/id_rsa

Подскажите, почему, в случае, если я использую подход, который указан выше, я получаю на 4ой строке chmod: cannot access '/root/.ssh/': No such file or directory. Если же я записываю ту же конструкцию без переменных окружения, то всё работает:

FROM golang:1.15.5
ADD ./id_rsa /root/.ssh/id_rsa
ADD ./.gitconfig /root/.gitconfig
RUN chmod 700 /root/.ssh/
RUN chmod 700 /root/.ssh/id_rsa

Ответы (1 шт):

Автор решения: Alexander Pavlov

Тут уже в комментариях дали ссылку на ответ, объясняющий проблему.

RUN выполняется во временном шелле, созданном для текущего юзера (root), поэтому $HOME определена.

ADD - это просто команда докеру по созданию очередного слоя. В этой команде есть доступ только к параметрам, заданным через ARG.

Иными словами, ADD ./id_rsa $HOME/.ssh/id_rsa создаёт файл в /.ssh, а не в /root/.ssh, в чём можно легко убедиться, добавив RUN ls -la /.ssh сразу после ADD

$ cat Dockerfile
FROM golang:1.15.5
ADD ./id_rsa $HOME/.ssh/id_rsa
RUN ls -la /.ssh
RUN chmod 700 $HOME/.ssh/
RUN chmod 700 $HOME/.ssh/id_rsa

$ docker build --rm --no-cache .
Sending build context to Docker daemon   2.56kB
Step 1/5 : FROM golang:1.15.5
 ---> 6d8772fbd285
Step 2/5 : ADD ./id_rsa $HOME/.ssh/id_rsa
 ---> 689fcc568705
Step 3/5 : RUN ls -la /.ssh
 ---> Running in 6fa38444b171
total 8
drwxr-xr-x 2 root root 4096 Dec 18 19:11 .
drwxr-xr-x 1 root root 4096 Dec 18 19:11 ..
-rwxr-xr-x 1 root root    0 Dec 18 19:10 id_rsa
Removing intermediate container 6fa38444b171
 ---> 71ab83680f4e
Step 4/5 : RUN chmod 700 $HOME/.ssh/
 ---> Running in 50dcd33324e3
chmod: cannot access '/root/.ssh/': No such file or directory
The command '/bin/sh -c chmod 700 $HOME/.ssh/' returned a non-zero code: 1

Решением будет грузить во временную папку и потом, уже двигать

FROM golang:1.15.5
ADD ./id_rsa /tmp/.ssh/id_rsa
RUN mv -f /tmp/.ssh $HOME
RUN chmod 700 $HOME/.ssh/
RUN chmod 700 $HOME/.ssh/id_rsa
→ Ссылка