Особенность использования переменных окружения в 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 шт):
Тут уже в комментариях дали ссылку на ответ, объясняющий проблему.
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