我已经尝试了一段时间,要通过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发行人吗?
答案 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
并没有真正影响您要在容器中运行的单个主进程。