我们的前端有这样的Dockerfile:
FROM node:13.12.0
RUN apt-get update && apt-get install -y --no-install-recommends \
apt-utils \
git \
xvfb \
libgtk-3-0 \
libxtst6 \
libgconf-2-4 \
libgtk2.0-0 \
libnotify-dev \
libnss3 \
libxss1 \
libasound2 \
tzdata && \
rm -rf /var/lib/apt/lists/* && \
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
WORKDIR /code
COPY ./ /code
RUN npm set registry <registry-url> && \
npm cache clean --force && npm install && npm run bootstrap据我所知,它并没有优化,因为代码复制发生在依赖项安装之前,对吧?更好的方法是先复制package.json并安装依赖项,然后再复制代码?如下所示:
FROM node:13.12.0
RUN apt-get update && apt-get install -y --no-install-recommends \
apt-utils \
git \
xvfb \
libgtk-3-0 \
libxtst6 \
libgconf-2-4 \
libgtk2.0-0 \
libnotify-dev \
libnss3 \
libxss1 \
libasound2 \
tzdata && \
rm -rf /var/lib/apt/lists/* && \
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
WORKDIR /code
COPY package*.json ./
RUN npm set registry <registry-url> && \
npm cache clean --force && npm install && npm run bootstrap
COPY ./ /code
ENTRYPOINT ["/docker-entrypoint.sh"]发布于 2021-03-05 22:37:59
我认为与Dockerfile优化相关的最重要的事情之一是将可能会更改的元素放在容器的未来版本中,这是在代码部分发生任何更改的情况下的最新原因,因为最新的更改不会强制在其他层上进行重新创建。
我认为这就是Dockerfile看起来像第一个示例的原因。关于Dockerfile优化,您可以在这里阅读其他注意事项,例如:https://linuxhint.com/optimizing-docker-images/
发布于 2021-03-07 02:06:10
hadolint/hadolint Dockerfile林特是一个很好的起点。使用Haskell Dockerfile Linter连接您的Dockerfile,即docker run --rm -i hadolint/hadolint < Dockerfile
/dev/stdin:5 SC2086 info: Double quote to prevent globbing and word splitting.
/dev/stdin:5 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`..。在通过几个小的修改修复了问题和sorting the packages alphanumerically following the best practices之后,您的Dockerfile可能如下所示:
FROM node:13.12.0
ARG NPM_REGISTRY
RUN apt-get update && \
apt-get install -y --no-install-recommends \
apt-utils=1.4.11 \
git=1:2.11.0-3+deb9u7 \
libasound2=1.1.3-5 \
libgconf-2-4=3.2.6-4+b1 \
libgtk2.0-0=2.24.31-2 \
libgtk-3-0=3.22.11-1 \
libnotify-dev=0.7.7-2 \
libnss3=2:3.26.2-1.1+deb9u2 \
libxss1=1:1.2.2-1 \
libxtst6=2:1.2.3-1 \
tzdata=2021a-0+deb9u1 \
xvfb=2:1.19.2-1+deb9u7 && \
rm -rf /var/lib/apt/lists/* && \
ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && \
echo "$TZ" > /etc/timezone
COPY docker-entrypoint.sh /docker-entrypoint.sh
WORKDIR /code
COPY package*.json ./
RUN npm set registry "${NPM_REGISTRY}" && \
npm cache clean --force && \
npm install && \
npm run bootstrap
COPY . .
ENTRYPOINT ["/docker-entrypoint.sh"]注意:较小的更改是优先的,即从上下文COPY . .到COPY到/code目录,这是由WORKDIR指令设置的。
通过NPM_REGISTRY作为构建参数构建镜像,即:docker build --rm --build-arg NPM_REGISTRY=https://yarn.npmjs.org -t so:66493910 .
https://stackoverflow.com/questions/66493910
复制相似问题