Docker部署编译好的Go web app

一、以ubuntu:14.04为基础构建Go web app容器

生成Linux平台的可执行程序

1
2
3
4
5
6
7
# 开发平台win-64bit, 目标平台linux-64bit
# 设置交叉编译参数
$ GOOS=linux GOARCH=amd64 go build -o app

#!/bin/sh
GOOS=linux GOARCH=amd64 go build -x -o app
cp ./app /d/share

拷贝Go Web App相关文件到工作目录

1
2
# 拷贝可执行文件到Ubuntu:/home/docker/godemo
$ cp /mnt/hgfs/share/app /home/docker/godemo

编写Dockerfile文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    # 基础镜像
    # Usage: FROM image:tag
    # image: ubuntu:14.04
    FROM ubuntu:14.04
    
    # 指定维护者信息
    # Usage: MAINTAINER name
    MAINTAINER <xxxx@163.com>

    # 给镜像添加工作目录
    # Usage: RUN [命令]
    RUN mkdir -p /home/docker/godemo
    
    # 设定默认工作路径
    # Usage: WORKDIR [path]
    WORKDIR /home/docker/godemo

    # 复制本地应用程序文件[src]到Container的工作目录[dst]
    # Usage: COPY [src] [dst]
    COPY ./demo /home/docker/godemo
    
    # 容器暴漏给外侧的端口号
    # Usage: EXPOSE port [port...]
    EXPOSE 80

    # 指定容器启动时执行的命令
    # Usage: CMD ["executable", "param1", "param2"]
    CMD ["/home/docker/godemo/demo"]

基于Dockerfile构建GoWebApp镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    # 基于编写的Dockerfile构建镜像
    $ docker build -t godemo:v1 .

    # -t, --tag list: name:tag
    # . Context(指定上下文)

    # docker build process

    Sending build context to Docker daemon 5.992 MB
    Step 1/6 : FROM ubuntu:14.04
    ---> 7c09e61e9035
    Step 2/6 : MAINTAINER <boyzhz@163.com>
    ---> Running in 1282ebc22a34
    ---> a89474ca8141
    Removing intermediate container 1282ebc22a34
    Step 3/6 : RUN mkdir -p /home/docker/godemo
    ---> Running in 3934893be90f
    ---> f7a045c2818e
    Removing intermediate container 3934893be90f
    Step 4/6 : WORKDIR /home/docker/godemo
    ---> 85a6d55081c4
    Removing intermediate container 717c78bfb69d
    Step 5/6 : COPY ./demo /home/docker/godemo
    ---> 90745d6e588e
    Removing intermediate container 233e72572d1f
    Step 6/6 : CMD /home/docker/godemo/demo
    ---> Running in ad773a1e2bcc
    ---> 5cc84642ef74
    Removing intermediate container ad773a1e2bcc
    Successfully built 5cc84642ef74

运行容器

1
2
3
4
5
6
$ docker run --name godemo -d -p 8000:8000 godemo:v1

# --name godemo, 指定容器名称godemo
# -d, 后台运行
# -p, 容器8000端口,映射到宿主机8000
# godemo:v1, 容器运行的基础镜像

二、以scratch为基础构建Go web app容器

  • 步骤与上面操作一致

  • Dockerfile

1
2
3
4
5
    FROM scratch

    COPY ./app /

    CMD ["/app"]
  • 在构建容器时可能出现如下问题:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    $ docker run -it -d -p 8000:8000 goapp:v0
    # no such file or directory
    # Error response from daemon: Cannot start container 79bb9fb62788b4a8c1487695a3219ddf3aa85bde2bc44473838f6f4d1583a204: [8] # System error: no such file or directory
    
    # 原因:app文件生成的时候依赖的一些库如libc还是动态链接的,但是scratch镜像完全是空的,什么东西也不包含,所以生成app时候要按照下面的方# 式生成,使生成的app静态链接所有的库:
    
    $ CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
    
    # 重新生成镜像
    $ docker build -t goapp:v0 .
    $ docker run -it -d -p 8000:8000 goapp:v0

See Also

Thanks to the authors 🙂