docker使用总结

文章目录

以非交互模式安装软件

在我们使用linux安装软件时,常常会弹出文本框让我们选择,但是在docker通过Dockerfile生成镜像时,它是非交互shell,可能会出现安装失败,要在运行Run命令时指定 DEBIAN_FRONTEND=noninteractive,它明确告诉了linux的程序安装器当前是非交互式shell

RUN DEBIAN_FRONTEND=noninteractive apt-get install -y apt-utils bash-completion vim cmake gcc g++ gdb git curl libcurl4-gnutls-dev unzip build-essential automake libtool python

缓存

当我们在通过docker构建程序时,如果是从svn或者git服务器上拉取代码再编译,那么由于命令与上次相同,就会出现不更新代码的问题,为了防止这种情况,可以通过docker build –no-cache来编译镜像,但是这样所以文件都不会使用缓存,生成时间太长,我们可以通过在拉取代码时运行不同的命令达到效果:

RUN DEBIAN_FRONTEND=noninteractive echo '2015121600' > /dev/null && git clone --depth=1 --recursive https://github.com/sails/saf.git

每次只用改变echo的内容即可;

日期

docker容器的时间默认是美国时间,在我们的程序中如果不注意就会出问题,可以在创建的image的时间指定:

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

coredump

为了生成coredump,可以在启动容器时指定–ulimit core=xx,不要用unlimited,要指定具体的值。

生成coredump

docker run有一个–ulimit选项,可以指定资源的限制,如当我们要生成core文件时:

docker run --ulimit core=1000000000000 test /test

使用coredump

当容器在正式环境中运行时,都是以后台-d选项启动的,那么这时如果生成了coredump,容器已经关闭了,那怎么调试呢?我们可以把coredump文件通过卷的方式放到host中,再另外启动一个容器,因为环境,服务都一样,所以这个coredump也适用于其它相同docker image生成的容器,所以在新的容器中调度就ok了:

sudo bash -c "echo /core/%e.core.%p > /proc/sys/kernel/core_pattern"
docker run --ulimit core=1000000000000 -v /home/sails/core:/core test /test

同时执行多个命令

在linux下,命令都是在当前shell中执行的,所以上次的更改会作用到下一次,常常会这样cd到目录,然后再编译程序,但是docker如果把多个命令分到不同的RUN指令中,不会成功,因为它的一个RUN就会打开一个shell进行,为了达到目的,可以把多个命令放在一起执行,但是这里要注意’&&’:

RUN DEBIAN_FRONTEND=noninteractive cd saf && mkdir build && cd build && cmake ../ && make

ADD与COPY命令的区别

官方建议最好用copy,因为它更明确,而ADD相当于:

RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.gz \
  | tar -xJC /usr/src/things \
&& make -C /usr/src/things all
  • ADD时,如果是一个压缩文件,docker会自动进行解析
  • ADD文件的来源可以远程文件,它会自动进行下载,而copy不行;

查看容器信息

docker stat containerId #容器的内存,cpu,网络io信息
docker inspect containerId #容器的配置信息,这个信息更大而全
原文链接:,转发请注明来源!

发表评论