写一个简单的 Dockerfile

221 阅读2分钟

v2-285d7daf8ef951904232693fb25abc7b_r.jpeg

前几天接手一些没啥交接的老项目,把所有项目导入现有的私有 gitlab,项目导入后发现这些项目的 CI/CD 和我们目前的模式完全不同,我们都上 k8s 了,这些还是往跳板机机器 rsync 构建产物,可谓是相当大的落差。之前的开发模式是本地配置 host config,需要导入跳板机的秘钥,每个人开发都得去这么配置一遍,相对比较繁琐,考虑到后续维护,打算把跳板机的秘钥以及 ssh config 扔到镜像上,可以避免后续开发的人要关心 ssh config 以及跳板机的信息,还有个好处是也不需要在 gitlab runner 机器配置多次,因为有多个 runner 机器,不写到镜像里还得每个机器都配置一遍,也很繁琐。

dockerfile 怎么写这里不过多介绍了,需要的话参考 docker 官网,这里直接看 Dockerfile 代码

FROM node:14.20.0-alpine3.16

# 设置工作区
WORKDIR /root

# 安装所需的依赖性,由于是 alpine 版本,有的依赖得自己装,比如 bash
RUN apk update && apk add curl unzip openssh bash
# 这里是把相关秘钥和 config 打了个压缩包扔到内网上
RUN curl -O http://xxx/ssh.zip
RUN unzip -d .ssh ssh.zip
RUN rm -rf ssh.zip
# 需要给创建的 .ssh 文件夹提高权限
RUN chmod 0700 -R .ssh
# 这里写了一个函数在 .bashrc 里,是方便引用镜像的地方使用
# eval `ssh-agent -s` 启动 ssh-agent 进程
# pushd && popd 是一个进出栈的命令
# ssh-add 是把默认秘钥添加到 ssh-agent 缓存中,ssh-add *.pem 这里是把指定的秘钥添加到缓存中
# echo 'a' >> b 是指将 a 写入 b 文件里
RUN echo 'init-ssh () {' >> ~/.bashrc
RUN echo '  eval `ssh-agent -s` && pushd ~/.ssh && ssh-add *.pem && ssh-add && popd' >> ~/.bashrc
RUN echo '}' >> ~/.bashrc

# 启动一个 bash shell
CMD ["/bin/bash"]

写好了 Dockerfile 之后然后就本地构建然后打 tag 上传私有 docker hub,然后在 .gitlab-ci.yml 中引入写好的镜像

# .gitlab-ci.yml
image: harbor.xxx.com/xxx/base-ssh:x.y.z

# 关键点,上面写的函数就是在这里执行的,当然你也可以不写函数,直接把那些放在这里执行
before_script:
    - source ~/.bashrc && init-ssh

就这么点东西中间还遇到不少坑,开始使用 Ubuntu:18.04 的时候本地打镜像执行 init-ssh 很正常,在 ci 上执行就死活找不到方法,如果有了解请告知一下~


PS: 说到 ssh-agent 缓存,之前遇到一个跳板机每天重新登录使用 ssh 会发现秘钥消失,需要重新 ssh-add 一下,其实可以把你的秘钥写到 .bashrc 或者 .zshrc 里面

# .bashrc/.zshrc
ssh-add ~/.ssh/id_rsa