Docker使用过程中遇到的问题
Docker使用过程中遇到的问题
在 Docker 中删除 image 时有时会遇到类似
Error response from daemon: conflict: unable to delete 6ec9a5a0fc9f (cannot be forced) - image has dependent child images
- 解决方案
这样的错误,原因是有另外的 image FROM 了这个 image,可以使用下面的命令列出所有使用该image 创建的 image 的父子image
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)
其中 xxxxxx 是报错 image 的 id,在文章开头的例子中就是 6ec9a5a0fc9f
。
从列表中查找到之后就可以核对并删除这些 image。
- 原因分析
注意 容器ID(containerID)和imageID 是两码事
当我想删除TAG为none的镜像时报错了
~ ⌚ 17:18:33
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chinaliuhan/myachain latest 50ea0690e13d 26 hours ago 9.93GB
chinaliuhan/myachain v2 489a93af7fe0 26 hours ago 9.93GB
chinaliuhan/myachain <none> 534b1d655e48 4 weeks ago 7.43GB
~ ⌚ 18:49:21
$ docker rmi 534b1d655e48
Error response from daemon: conflict: unable to delete 534b1d655e48 (cannot be forced) - image has dependent child images
因为我在之前使用imageID为534b1d655e48的容器进行了一次commit操作, commit出来了, ID为489a93af7fe0的镜像
docker commit -a 'liuhao' -m '同步区块' b90bdec1e733的容器ID chinaliuhan/myachain:v2
随后又基于imageID的容器534b1d655e48进行了commit了一次
docker commit -a 'liuhao' -m 'syn blockchain' 0433eb0a2653的容器ID chinaliuhan/myachain
这时候我要去直接删除534b1d655e48容器时不行了,因为后面的两个image都是基于这个建立的
要知道docker是分层的,要想删除父镜像,必须要先删除子镜像才行
~ ⌚ 19:15:04
$ docker rmi 5e8b97a2a082
Error response from daemon: conflict: unable to delete 5e8b97a2a082 (cannot be forced) - image has dependent child images
之前我们记得,哪个镜像是从何处commit而来的, 如果时间长不记得了呢.
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)
其中 xxxxxx 为imageIid
比如我们想知道, 哪个镜像下有子类,就可把哪个镜像的imageID放进去即可
一般我们只是把删除报错的那个放进去
容器问题
因为docker里面的系统进行了最小化安装,所以进入容器后很多命令都没有
这里列举出来我遇到的常用命令问题
ps命令安装
bash: ps: command not found
apt-get install -y procps
ping命令安装
bash: ping: command not found
apt-get install -y iputils-ping
netstat命令安装和ifconfig命令安装
bash: ifconfig: command not found
bash: netstat: command not found
这个其实集成了很多网络操作相关的命令,具体不太记得了
apt-get install -y net-tools
sudo命令安装
bash: sudo: command not found
apt-get install -y sudo
更多配置在下面
vim /etc/sudoers
dockerfile
不能使用su切换用户
刚才我在使用dockerfile 中使用了su liuhao切换账户,提示su: must be run from a terminal
就是说:su命令必须在终端中使用,
在stackoverflow上的高赞回答是使用-tt进行登录或者ssh开启了相关服务和端口后,ssh localhost 连接到了本机,并成功使用了su和sudo命令。
Dockerfile中如何自动回答标准输入的问题
创建用户同时设置密码,apt-get install安装MySQL时输入密码无效
&& bash -c '/bin/echo -e "sss\nsss\n\n\n\n\ny\n" | adduser liuhao'\
MySQL如果要做自动密码安装,需要借助工具,
在dockerfile中时,不是用root用户执行,比如已经USER liuhao 指定了其他的用户时
必须要用sudo debconf-set-selections,否则会暴一个权限错误
debconf: DbDriver "passwords" warning: could not open /var/cache/debconf/passwords.dat: Permission denied
这里将密码设置为sss,平时可以这么用,dockerfile中这么用会报错,提示语法错误
如果非要放到dockerfile中的话,可以使用bash -c "/bin/echo -e xxxx"配合使用
debconf-set-selections <<< 'mysql-server mysql-server/root_password password sss'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password sss'
sudo apt-get -y install mysql-server-5.7\
这里将密码设置为root 可以在命令行里平时用, 也可以在dockerfile中用
&& echo "mysql-server-5.5 mysql-server/root_password password root" | debconf-set-selections\
&& echo "mysql-server-5.5 mysql-server/root_password_again password root" | debconf-set-selections\
&& apt-get -y install mysql-server-5.5
docker的HOST模式只能在Linux下获取到客户端的IP.其他模式下在任何系统下都只能获取到docker的网桥IP.
本文来自博客园,作者:我爱吃炒鸡,转载请注明原文链接:https://www.cnblogs.com/chinaliuhan/p/15558381.html