Docker совет №30: Монтирование ssh-ключей в docker-контейнер
Jul 5, 2018 07:09 · 270 words · 2 minute read
Казалось бы, все очень просто - монтируете нужный каталог с ssh-ключами в соответствующее место внутри docker-контейнера. Но все становится куда интереснее, если вы используете Docker for Windows - давайте разберемся!
Эта “простая” команда выглядит так (в качестве примера возьмем образ alpine):
docker run --rm -it -v ~/.ssh:/root/.ssh:ro alpine
и она прекрасно сработает, если ваша операционная система Linux или MacOS. Дополнительный флаг :ro
позволяет монтировать том в docker-контейнер с правами только для чтения (чтобы случайно не испортить свои ssh-ключи).
Но при работе в Windows (в частности в WSL - Windows Subsystem for Linux) появляются две проблемы. Первая - Windows “не понимает” права доступа к файлам Linux. Поэтому внутри docker-контейнера каталог и его содержимое (ssh-файлы) появятся с правами 777, и, следовательно, работать не будут.
Стоит отметить, что в Windows 10 последнего выпуска (весна 2018) есть возможность монтировать ваши тома (и внешние устройства) в WSL с добавлением метаданных, которые поддерживают передачу прав доступа к файлам Linux, но Docker for Windows все равно смонтирует такой том через CIFS, который “обрежет” метаданные.
Вторая проблема - дополнение к вышеупомянутой: нельзя монтировать файлы, которые существуют непосредственно на вашем WSL-диске. Внутри docker-контейнера смонтированный каталог будет пустым.
Решить данную проблему проще всего с помощью entrypoint-скрипта. Для этого, в каталоге с имеющимся Dockerfile
создаем файл docker-entrypoint.sh
следующего содержания:
#!/bin/sh
set -e
cp -R /tmp/.ssh /root/.ssh
chmod 700 /root/.ssh
chmod 644 /root/.ssh/id_rsa.pub
chmod 600 /root/.ssh/id_rsa
exec "$@"
После чего в Dockerfile
нужно добавить пару строк (перед инструкцией CMD
):
...
COPY docker-entrypoint.sh /bin/docker-entrypoint.sh
RUN chmod +x /bin/docker-entrypoint.sh
ENTRYPOINT ["/bin/docker-entrypoint.sh"]
...
Теперь запускаем контейнер с помощью команды:
docker run --rm -it -v /e/backup/home/lebed/.ssh:/tmp/.ssh:ro <your_image>
Примечание. Не забудьте заменить путь /e/backup/home/lebed/.ssh
на свое значение.