启动容器报错:
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系统