Копировать файлы или клонировать через ssh в Dockerfile при создании образа Docker - PullRequest
0 голосов
/ 25 июня 2019

Я некоторое время пытался скопировать файлы через ssh с удаленного сервера (не gihub) внутри образа докера, который я хочу создать, но не могу подключиться к хосту.Вот файл Docker вплоть до критической точки:

FROM r-base:latest

### Install libs
RUN apt-get update && apt-get install -y \
    sudo \
    gdebi-core \
    pandoc \
    pandoc-citeproc  \
    openssh-server \
    openssh-client \
    libcurl4-gnutls-dev \
    libcairo2-dev \
    libxt-dev \
    xtail \
    wget \
    libssl-dev \
    libxml2 \
    libxml2-dev \
    libv8-dev \
    curl \
    gnupg \
    git

COPY ./setup setup

RUN mv setup/.ssh ~/.ssh
RUN touch ~/.ssh/known_hosts
RUN chmod -R 400 ~/.ssh
RUN ssh-agent sh -c 'ssh-add /root/.ssh/id_rsa'
#RUN eval "$(ssh-agent -s)"
#RUN ssh-add -K ~/.ssh/id_rsa #This is commented out as it causes an error
RUN ssh-keyscan hostname > ~/.ssh/known_host
RUN ssh-keygen -R hostname

## THIS IS THE COMMAND WE NEED TO RUN...
RUN scp -r user@hostname:/path/to/folder ./

Владелец папки - user.Id_rsa.pub был добавлен в файл author_keys пользователя user на хосте, и ssh был перезапущен там.Однако я получаю ошибку аутентификации Failed.Я попытался использовать мой личный id_rsa, который работает из командной строки, но он также не работает внутри докера.Это эмитент докера, это разрешимо?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Мне наконец удалось это сделать, сгенерировав ключ с помощью команды, предложенной в этом посте

Итак, чтобы воспроизвести мой случай, локально:

cd setup/.ssh/
ssh-keygen -q -t rsa -N '' -f id_rsa

Затем на сервере добавьте содержимое id_rsa.pub к известным хостам для пользователя user. Можно скопировать содержимое в буфер обмена с помощью xclip: xclip -sel clip < setup/.ssh/id_rsa.pub)

Dockerfile:

Некоторое время я пытался скопировать файлы через ssh с удаленного сервера (не gihub) внутри образа докера, который я хочу создать, но не могу подключиться к хосту. Вот Dockerfile до критической точки:

FROM r-base:latest

### Install libs
RUN apt-get update && apt-get install -y \
    sudo \
    gdebi-core \
    pandoc \
    pandoc-citeproc  \
    openssh-server \
    openssh-client \
    libcurl4-gnutls-dev \
    libcairo2-dev \
    libxt-dev \
    xtail \
    wget \
    libssl-dev \
    libxml2 \
    libxml2-dev \
    libv8-dev \
    curl \
    gnupg \
    git

COPY ./setup setup

RUN chmod -R 600 ~/.ssh
RUN echo "IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config
RUN echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config

## THIS IS THE COMMAND WE NEED TO RUN...
RUN scp -r user@hostname:/path/to/folder ./
0 голосов
/ 25 июня 2019

Нет конкретного требования, что вы должны делать все внутри вашего Dockerfile. Особенно то, что требует удаленного доступа по ssh, лучше делать вне Docker: учтите, что любой, кто получит ваше изображение позже, может docker cp получить из него действительный ключ ssh и потенциально получить доступ к вашим внутренним системам.

По причинам, связанным с кэшированием в Docker, также не рекомендуется git clone или иным образом пытаться удаленно извлечь ваше приложение из Dockerfile. Если вы перезапустите docker build, и ничего в вашем Dockerfile не изменилось, то Docker также пропустит шаг scp, даже если удаленный контент изменил .

Моя общая рекомендация заключается в том, чтобы скопировать этот контент из-за пределов Dockerfile, а затем собрать его

# Using whatever credentials are in your local ssh-agent
scp -r user@hostname:/path/to/stuff dist/

# Then your Dockerfile doesn’t need scp or credentials
docker build .

Ваш Dockerfile не нуждается в куче дополнительных пакетов, которые имеют отношение только к этому пути: вы должны быть в состоянии удалить sudo openssh-server openssh-client xtail curl gnupg git фактически не затрагивая единственный основной процесс, который вы пытаетесь запустить внутри своего контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...