Loading

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.

posted @ 2021-11-15 21:34  我爱吃炒鸡  阅读(144)  评论(0编辑  收藏  举报