docker error while loading shared libraries
环境: centos7.6 、docker 19.03在使用 docker build 后,执行 docker run ,容器起不来,报错error while loading shared libraries: libprotobuf.so.9,镜像中已经有 libprotobuf.so.9,怀疑是环境变量问题导致。解决方法直接跳到第 8 步1、docker build# docker buil
环境: centos7.6 、docker 19.03
在使用 docker build 后,执行 docker run ,容器起不来,报错 error while loading shared libraries: libprotobuf.so.9,镜像中已经有 libprotobuf.so.9,怀疑是环境变量问题导致。
解决方法直接跳到第 8 步
1、docker build
# docker build -t data:18 .
Dockerfile 大致如下,192.168.7.17/energy/centos7-base:v9 是一个私有镜像,在 centos7 镜像基础上增加了很多库,run.sh 执行这个脚本 /usr/bin/DataCenter
FROM 192.168.7.17/energy/centos7-base:v9
...
EXPOSE 9017
ENTRYPOINT ["./run.sh"]
2、docker run
# docker run --name xx -it data:18
3、docker 容器起不来,查看日志
# docker logs -f xxx
/usr/bin/DataCenter: error while loading shared libraries: libprotobuf.so.9: cannot open shared object file: No such file or directory
4、覆盖 entrypoint,启动容器
# docker rm xx
# docker run --name xx --entrypoint /bin/bash -dit data:18
5、在容器里面执行 ./run.sh 成功
# docker exec -it xx bash
[root@dc48f39cf483 DataCenter9017]# ./run.sh
6、在容器外面通过 docker exec 执行 ./run.sh 失败
# docker exec xx ./run.sh
/usr/bin/DataCenter: error while loading shared libraries: libprotobuf.so.9: cannot open shared object file: No such file or directory
7、对比容器里面的环境变量和 docker exec 时的环境变量
容器外面 LD_LIBRARY_PATH 为空,测试后发现 docker exec $env 其实为宿主机的 $env
# docker exec xx echo $LD_LIBRARY_PATH
容器里面 LD_LIBRARY_PATH 值为 :/usr/local/lib
# docker exec -it xx bash
[root@dc48f39cf483 DataCenter9017]# echo $LD_LIBRARY_PATH
:/usr/local/lib
在容器里面添加 a.sh
[root@dc48f39cf483 DataCenter9017]# cat a.sh
echo $LD_LIBRARY_PATH
[root@dc48f39cf483 DataCenter9017]# sh a.sh
:/usr/local/lib
在容器外面中 a.sh,返回为空,说明在执行 docker run 或者 docker exec 命令容器并没有 LD_LIBRARY_PATH 这个环境变量
[root@ansible002 supervisor]# docker exec xx sh a.sh
8、在 Dockerfile 中添加 ENV 或者 docker run\exec 时添加 -e
# cat Dockerfile
FROM 192.168.7.17/energy/centos7-base:v9
...
ENV LD_LIBRARY_PATH=:/usr/local/lib
EXPOSE 9017
ENTRYPOINT ["./run.sh"]
# docker exec -e LD_LIBRARY_PATH=:/usr/local/lib xx ./run.sh
总结:docker run/exec 时的环境变量和进入到容器里面的环境变量有些区别
更多推荐
所有评论(0)