最近准备用Node和TS整点玩具练下手,俗话说工欲善其事必先利其器.所以首先就是整开发环境,然后再搭建CI CD.那么为了做到环境统一,因为觉得Docker比kubernates出来的早应该有更多资源可以参考.所以选择了用Docker.于是踩坑的一天又开始了.下面记录下在构建自己的ubuntu镜像中遇到的问题.附录有构建镜像的实际代码.也可以访问我的github仓库获取最新的代码.
1.构建Ubuntu镜像时候遇到的问题
(1) Build 过程中需要选择时区的问题
这个问题的情况就是你在build Dockerfile的时候会卡住需要你选择时区才能继续(实际上你根本选不了) 这个问题还很好解决只需要加上附录中Dockerfile代码中的第7行和第10行.
(2) Build 过程中遇到的网络问题
在Build的时候需要给系统安装一些软件,就需要 apt-get update
和 apt-get insatll
但是,在docker中如果不手动配置代理的话,这是没办法成功的.这个问题官方有给解决方案,可以让docker使用本机的代理设置.下面讲下我自己解决这个问题实际案例.你需要在安装docker的机器上也就是你的本机上的根目录下(Linux: ~/.docker/config.json, Windows: C:\Users{username}.docker\config.json)的/.docker/config.json
中添加上proxies属性,大概是这样的一个格式.这样容器启动的时候就会自动把这些代理的配置信息给加上.
1
2
3
4
5
6
7
8
9
10
11
{
"proxies":
{
"default":
{
"httpProxy": "http://{localhost ip}:{port}",
"httpsProxy": "http://{localhost ip}:{port}",
"noProxy": "localhost"
}
}
}
实际上我的配置
1
2
3
4
5
6
7
8
9
10
11
{
"proxies":
{
"default":
{
"httpProxy": "http://192.168.3.100:58591",
"httpsProxy": "http://192.168.3.100:58591",
"noProxy": "localhost"
}
}
}
2. 容器运行过程中遇到的的问题
(1) ssh 连接不上的问题
历经千辛万苦终于build成功了我们的镜像,果断跑起来,然后使用VS Code Remote 连接到我们的Docker容器里面,这个时候突然我发现连接失败,然后手动再终端里面 (ssh -p 36000 root@127.0.0.1)
连接到我们的容器,结果抛出了这样的一个错误 ssh_exchange_identification: Connection closed by remote host
,经过一番查找资料调试.发现是容器里面的ssh服务没起来.原因是附录中的bash脚本第17行的代码没有加 ‘-D’ 选项.
(2) Git alias 不生效的问题
这个原因还是bash脚本第17行的代码(Linux知识太菜了T_T),因为’-D’选择会让这个服务常驻,就是再命令行里面,你输入了比如node指令,就进入了node的服务,你输入任何别的命令都没反应.这个时候只能Ctrl + C 退出.所以因为我把这行代码加到了bash脚本的第1行,所以导致,git alias 这些命令并没有执行.
(3) 多用户文件权限问题(未解决,直接使用root用户绕过问题)
因为Docker build 的时候使用的root用户build的,所以在这过程中我安装的nvm,node等软件,对于build过程中添加的用户是不可见的,所以虽然我们的软件都安装成功了,但是我们在build过程中添加的用户还是使用不了这些软件(我比较懒,不可能手动再安装一遍这些软件的,所以肯定是想再build的时候都安装上)由于linux知识匮乏,所以这个问题我自己其实并未解决,因为我的情况来说,就一个人使用我自己构建的镜像,所以我直接直接使用root用户登录的.
3.其他的一些小问题
(1) zsh 识别不了node命令的问题
安装完zsh后发现node -v 报错: zsh command not found: node
,解决办法就是需要把根目录下的 .bashrc 文件的下面这段内容复制到 .zshrc里面去
1
2
3
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
(2) push 镜像的问题
本以为完事大吉,准备push一下我自定义完成的镜像.但是最后时刻报出了这样的错误 denied: requested access to the resource is denied
,一开始以为是没权限,虽然是参考stackoverflow解决的.但我一开始命名混乱的问题折腾了一会.
所以这里我用我的实例解释下具体要怎么做,我build 镜像的时候是运行了这个命令docker build -t ubuntu:18.04 .
,给我的镜像取名叫ubuntu, tag是18.04,这个时候下面这个的俩条命令的firstimage
就要换成 ubuntu:18.04
, YOUR_DOCKERHUB_NAME
就是你登录docker的用户名.这样就能成功的push你的镜像上去了.
1
2
3
docker tag firstimage YOUR_DOCKERHUB_NAME/firstimage
docker push YOUR_DOCKERHUB_NAME/firstimage
4.附录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
FROM ubuntu:18.04
ENV NODE_VERSION="14.16.1"
ENV LANG=en_US.UTF-8
ENV TZ=Asia/Shanghai
# Set time zone
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
RUN apt-get update -y && apt-get -y install ssh \
ntp \
vim \
wget \
curl \
telnet \
git \
subversion \
doxygen \
lighttpd \
net-tools \
inetutils-ping
# Install zsh
RUN bash -c "$(curl -fsSL https://git.io/JJaFd)"
RUN mkdir /var/run/sshd
# Change sshd listen port
RUN sed -i 's/#Port[ ]*22/Port 36000/' /etc/ssh/sshd_config
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
# Enable root login
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN echo "root:123456" | chpasswd
# Install nvm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
RUN export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \
nvm install $NODE_VERSION && \
nvm install node && \
nvm use $NODE_VERSION
# Container should expose ports.
EXPOSE 36000
ADD setup-env.sh /root/setup-env.sh
RUN chmod a+x /root/setup-env.sh
CMD ["/root/setup-env.sh"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
git config --global user.name "Ligengxin"
git config --global user.email "Ligengxin96@gmail.com"
git config --global credential.helper store
git config --global core.autocrlf true
git config --global alias.s 'status'
git config --global alias.b 'branch'
git config --global alias.nb 'checkout -b'
git config --global alias.ck 'checkout'
git config --global alias.pl 'pull'
git config --global alias.ps 'push'
git config --global alias.plom 'pull origin master'
git config --global alias.psom 'git push --set-upstream origin'
git config --global alias.master 'checkout master'
/usr/sbin/sshd -D