在mac上编译golang
项目,一开始使用如下dockerfile
进行构建镜像:
# syntax=docker/dockerfile:1
FROM golang:1.20-alpine
ENV PATH=/app
WORKDIR $PATH
COPY service $PATH
CMD ["service"]
容器运行后发现只能通过sh
进入容器,无法通过bash
进入,以及这个sh
好像不支持常用命令:
/app # ls
/bin/sh: ls: not found
/app # top -c
/bin/sh: top: not found
搜索了相关问题,说是要在镜像中加入bash
。
修改dockerfile
:
# syntax=docker/dockerfile:1
FROM golang:1.20-alpine
ENV PATH=/app
WORKDIR $PATH
RUN apk update \
&& apk upgrade \
&& apk add --no-cache bash \
&& apk add --no-cache bash-doc \
&& apk add --no-cache bash-completion \
&& rm -rf /var/cache/apk/* \
COPY service $PATH
CMD ["service"]
但是构建时报错:
=> ERROR [3/3] RUN apk update
&& apk upgrade
&& apk add --no-cache bash
&& apk add --no-cache bash-doc
&& apk add --no-cache bash-completion
&& rm -rf /var/cache/apk/*
COPY mail /
0.2s
------
> [3/3] RUN apk update
&& apk upgrade
&& apk add --no-cache bash
&& apk add --no-cache bash-doc
&& apk add --no-cache bash-completion
&& rm -rf /var/cache/apk/*
COPY mail /app:
#12 0.161 /bin/sh: apk: not found
------
executor failed running [
/bin/sh -c apk update
&& apk upgrade
&& apk add --no-cache bash
&& apk add --no-cache bash-doc
&& apk add --no-cache bash-completion
&& rm -rf /var/cache/apk/*
COPY mail $PATH
]:
exit code: 127
请问这是为何呢?
已解决
问题出在了Dockerfile
中的这一行:
ENV PATH=/app
这行起初准备将工作目录定义为一个变量,但是却使用了PATH
这个名称,而PATH
是特指环境变量的,这个冲突导致了后续的一系列问题。
换个变量名,上述问题全部解决:
ENV WD=/app
以及
go
交叉编译后的可执行二进制文件,完全不需要再基于golang
镜像来构建了,直接基于alpine
镜像构建即可:
# syntax=docker/dockerfile:1
FROM alpine
ENV WD=/app
WORKDIR $WD
COPY service $WD
CMD ["service"]
如果部署后确定没有进入容器操作的需求,甚至可以再激进一些,直接基于空镜像构建:
# syntax=docker/dockerfile:1
FROM scratch
ENV WD=/app
WORKDIR $WD
COPY service $WD
CMD ["service"]
docker镜像一般都会保持相当精简。有些甚至默认不会带vim。
所以
golang:1.20-alpine
没有apk
命令也很正常。你可以选择其他镜像来做,不过一般会比这个体积大一些。