欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker 常见遇到的坑

程序员文章站 2022-05-14 20:41:52
...

1

运行docker容器时报standard_init_linux.go:195: exec user process caused "no such file or directory"
解决办法
使用以下命令确认是不是这个原因:

cat -v run-lamp.sh 
#!/bin/bash^M
打开脚本发现里面有^M
就是^M这个造成的问题。(原来是dos字符与unix字符的问题 Windows和Linux平台表示回车的方法不一样)
解决方法:
安装dos2unix 
yum install dos2unix
将相关文件转换一下字符即可:
dos2unix Dockerfile
dos2unix run-lamp.sh
重新build可以正常运行了

2docker容器时间和宿主机时间不匹配

/*直接用宿主机器上的时区默认覆盖容器内的时区配置文件即可,也就是跟宿主机器同样的时区配置  */
# docker run -v /etc/localtime:/etc/localtime:ro 镜像id

但是我相信如果写过java的人仍然发现通过java 中new Date()获取到的仍然是容器默认的时区,而是宿主机器上的时区配置,因为java是通过获取timezone来设置时间的。不废话,继续看以下命令:

# docker run -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro  镜像id

3 docker 最大的坑目前不知道原因(docker像容器内传参)

因为部署项目启动容器要动态传参,网上的做法是这样的

FROM java:8
ADD microsoft.jar /root
ENV PARAMS=""
ENTRYPOINT ["sh","-c","java $PARAMS -jar /root/microsoft.jar"]

启动命令为

docker run -d -e PARAMS="-Dserver.port=8080" -p 2000:8080 镜像名称
这样jar包在启动的时候就会去读输入变量

但是死活我的都不成功,大家可以向我这样(实测完美)
1编写启动脚本 (注意不能再windows上编写不然会报上面第一个错)

!#!/bin/bash
java -jar -DeurekaServerUrl=$EUREKAURL -Dhost=$HOST  /app.jar --spring.profiles.active=prod

2修改Dockerfile

FROM java:8
VOLUME /tmp
COPY ./user-model-0.0.1.jar /app.jar
COPY ./start.sh /
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]

3启动

docker run -d -e EUREKAURL=http://172.21.0.16:8761/eureka -e HOST=172.21.0.16  -v /logs:/logs --name redis -p 8665:8080 6a7cc5414a4f

完美!这样urekaServerUrl 和 host 就传进去了;