findxc / blog

88 stars 5 forks source link

一次 docker 镜像构建踩坑记录 #59

Open findxc opened 3 years ago

findxc commented 3 years ago

这应该是近期 docker 相关的最后一篇了,这一切都是因为要优化下一个项目的镜像构建速度,用这个踩坑记录作为终章也挺合适的 hhh

本地构建镜像时,打包一直莫名失败

是的,从一开始就不顺利,本地测试时,镜像构建一直卡在打包那里,等着等着就失败了,又看不到啥有效日志。

最后的最后,想起来,会不会是内存不足导致的打包失败。

经过大佬指点默默把 docker 的内存设置从默认的 2G 改为 4G ,再次构建,就成功了。

593051C3-1AE7-4C79-93D8-DD186E3A61F6

私有 npm 仓库时, yarn 装包一直失败

对于 yarn v1 安装私有仓库包,需要这样去装包: RUN yarn || yarn || yarn ,详见 Yarn install for private module failing - unexpected end of file · Issue #7521 · yarnpkg/yarn · GitHub

万物皆可国内源

凡是涉及到下载啥啥,如果发现很慢,就配置下国内源。

# 设置 npm 源
RUN npm config set registry https://registry.npm.taobao.org

# 这里有常见的镜像地址 --> https://github.com/cnpm/binary-mirror-config/blob/master/package.json#L44
ENV npm_config_sharp_binary_host="https://npm.taobao.org/mirrors/sharp"
ENV npm_config_sharp_libvips_binary_host="https://npm.taobao.org/mirrors/sharp-libvips"
ENV npm_config_sentrycli_cdnurl="https://npm.taobao.org/mirrors/sentry-cli"

# 设置 apk 源,如果有用到 apk 的话
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

yarn 装包只安装了生产依赖,没有开发依赖

在 node 镜像中,如果先设了 ENV NODE_ENV production ,然后再 RUN yarn ,就会只安装生产依赖,所以如果想安装全部依赖,要把 ENV NODE_ENV production 这一步放后面。

如果不需要依赖的缓存,就不要或者清理掉,减小镜像体积

CMD 中想使用变量只能用环境变量

ARG 参数在 CMD 中读取不到,因为 ARG 是构建时,而 CMD 是运行时,CDM 只能读到环境变量。

并且使用 CMD ["npm", "run", "serve:${BUILD_ENV}"] 这种写法也是读不到值的,需要用 CMD npm run serve:${BUILD_ENV}

# docker build --build-arg BUILD_ENV=dev --build-arg xxx=xxx -t hello:v1 .

# 环境,比如 dev prod
ARG BUILD_ENV
# BUILD_ENV 在 CMD 中需要用到,ARG 只是构建时能读取,CMD 是运行时执行的,只能读到 ENV
ENV BUILD_ENV ${BUILD_ENV}

COPY . .
# 这里其实就 ARG 就够了,因为这一步还是构建过程
RUN make build.${BUILD_ENV}

# 不要用 CMD ["npm", "run", "serve:${BUILD_ENV}"] ,因为会读不到 BUILD_ENV 
# 见 https://github.com/moby/moby/issues/5509#issuecomment-42173047
CMD npm run serve:${BUILD_ENV}

在宿主机上先拉取一次基础镜像

比如需要 FROM node:14.16.1-alpine3.13 ,在宿主机上先拉取一次 node:14.16.1-alpine3.13 会加快一丢丢镜像构建速度,拉取后下图中的 1.6s 会变为 0s 。

C80F5D8E-0EAE-4D66-990A-D4E43FA767C2