Posts 使用Dockerfile自定义镜像
Post
Cancel

使用Dockerfile自定义镜像

  最近准备用Node和TS整点玩具练下手,俗话说工欲善其事必先利其器.所以首先就是整开发环境,然后再搭建CI CD.那么为了做到环境统一,因为觉得Docker比kubernates出来的早应该有更多资源可以参考.所以选择了用Docker.于是踩坑的一天又开始了.下面记录下在构建自己的ubuntu镜像中遇到的问题.附录有构建镜像的实际代码.也可以访问我的github仓库获取最新的代码.

1.构建Ubuntu镜像时候遇到的问题

(1) Build 过程中需要选择时区的问题

  这个问题的情况就是你在build Dockerfile的时候会卡住需要你选择时区才能继续(实际上你根本选不了) 这个问题还很好解决只需要加上附录中Dockerfile代码中的第7行和第10行.

(2) Build 过程中遇到的网络问题

  在Build的时候需要给系统安装一些软件,就需要 apt-get updateapt-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
This post is licensed under CC BY 4.0 by the author.

React diff算法分析和理解

Azure Automation Account Runbook 入门