环境: 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 时的环境变量和进入到容器里面的环境变量有些区别

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐