构建Docker映像时,通过Dockerfile中的ssh复制文件或克隆

时间:2019-06-25 13:17:34

标签: docker ssh

我已经尝试了一段时间,要通过ssh从要构建的docker映像中的远程服务器(不是gihub)复制文件,但是我无法连接到主机。这是直到关键点的Dockerfile:

post(url: string, body: any | null, options: {
    headers?: HttpHeaders | {
        [header: string]: string | string[];
    };
    observe?: HttpObserve;
    params?: HttpParams | {
        [param: string]: string | string[];
    };
    reportProgress?: boolean;
    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
    withCredentials?: boolean;
} = {}): Observable<any> 

文件夹的所有者为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 ./ 。将id_rsa.pub添加到主机上用户user的authorized_keys文件中,并在此处重新启动ssh。但是,我收到失败的身份验证错误。我尝试使用从命令行运行的个人id_rsa,但在docker内部也失败。这是一个可解决的Docker发行人吗?

2 个答案:

答案 0 :(得分:1)

我终于设法通过使用this post

中建议的命令来生成密钥

所以要在本地复制我的案子:

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从要构建的docker映像中的远程服务器(不是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 ./

答案 1 :(得分:0)

没有特别要求您必须在Dockerfile中进行所有操作。尤其是需要远程ssh访问的事情最好在Docker之外完成:考虑到以后获得您的映像的任何人都可以docker cp使用其中的有效ssh密钥,并有可能访问您的内部系统。

出于Docker缓存的原因,git clone或尝试从Dockerfile内部远程检索应用程序也不是一个好主意。如果您重新运行docker build,而Dockerfile中的其他内容均未更改,则Docker也将跳过scp步骤,即使远程内容已更改。 / p>

我的一般建议是从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 { {1}} curl gnupg并没有真正影响您要在容器中运行的单个主进程。