docker容器启动报错

在CentOS 7环境下启动Golang项目容器报错,原因是在CentOS下构建的可执行文件,在Dockerfile里使用了Alpine(Ubuntu系统)镜像。解决方法是让构建和执行可执行文件使用相同系统,推荐用Ubuntu镜像构建并执行,方便快捷且性能好。

启动容器报错:

standard_init_linux.go:178: exec user process caused "no such file or directory"
  • 报错背景
    我需要启动一个golang项目的容器,然后在我的centos7环境下将golang源码build成了一个可执行文件,写了一个Dockerfile,生成了一个容器。但是容器报错,以下是我的dockerdile
FROM alpine
ADD server /usr/bin/
WORKDIR /data
CMD ["server"]

生成一个镜像没问题,生成容器的时候报了上面的错误
后来查到是因为系统的问题,我在centos下build的项目可执行文件,但是在Dockerfile里面,我用的是alpine镜像,这个镜像时ubuntu系统的,所以导致报了上面的错误

  • 解决方法:
    解决方法就是让源码在build成一个可执行文件和执行这个可执行文件时,都使用同样的系统,以下是两种解决方法:

方法一:如果你已经在centos环境build了可执行文件,那么你的Dockerfile应该这样写:

FROM centos:7
ADD server /usr/bin/
WORKDIR /data
CMD ["server"]

即在可执行文件执行的环境也使用centos的环境

方法二:我使用一个ubuntu的镜像来将源码build成一个可执行文件,同时也在ubuntu中执行这个可执行文件
以下是Dockerfile

FROM golang:1.11-alpine

ENV SERVER=/go/src/git.phjr.com/server

COPY . $server/

RUN cd /go/src/git.phjr.com/server \
&& go build

FROM alpine

ENV SACC=/go/src/git.phjr.com/server
COPY --from=0  $SACC/server /usr/bin
WORKDIR /data

CMD ["server"]

可以通过以上Dockerfile看到,我在将源码build为一个可执行文件时,使用的是golang:1.11-alpine,此镜像中带有需要的golang环境,同时也是一个ubuntu镜像,刚好和我执行环境是一样的系统

推荐使用第二种方法,这种方法可以将源码一键build成一个镜像,方便快捷,同时,alpine镜像体积非常小,性能当然会更好,其次就是docker的底层存储使用的是ubuntu系统,所以,在构建docker镜像时,最好采用ubuntu系统

### Docker 容器创建报错解决方案 当遇到Docker容器创建时报错的情况,可以从以下几个方面着手解决问题: #### 一、确认镜像是否存在 确保所使用的镜像已经成功下载至本地。可以通过命令`sudo docker images`查看当前已有的镜像列表[^1]。 如果目标镜像不在其中,则需先通过`docker pull 镜像名[:标签]`拉取所需镜像。 #### 二、检查配置文件准确性 仔细核对用于构建或启动容器的相关参数设置是否正确无误。这包括但不限于环境变量定义、挂载卷路径指定等方面的内容。对于复杂的应用场景,建议参照官方文档或者社区最佳实践来调整配置选项。 #### 三、排查资源限制因素 某些情况下,由于宿主机内存不足或其他硬件条件制约可能导致容器无法正常启动。此时可以尝试增加分配给Docker服务的可用资源量;另外也要留意是否有其他进程占用了必要的端口号而造成冲突现象发生。 #### 四、处理遗留数据影响 如果有之前未清理干净的老版本组件残留下来的话也会影响新实例的成功部署。按照指引卸载旧版软件包后再重新安装最新稳定版本往往能有效规避此类隐患[^2]。 ```bash sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine ``` #### 五、针对特定错误码采取措施 面对具体的异常提示信息时,应该针对性地查找对应的解决办法。比如提到的"NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager"这类Java相关的问题可能是由缺少图形界面支持引起,在非交互式的环境中可通过修改应用内部逻辑绕过GUI依赖或是安装相应的字体库等方式加以克服[^4]。 最后提醒一点,每次操作前后都记得及时保存重要资料备份,并保持良好的日志记录习惯以便于后续追踪定位潜在风险源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰哥的技术杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值