首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Dockerfile

优化Dockerfile
EN

Stack Overflow用户
提问于 2021-03-05 22:02:25
回答 2查看 106关注 0票数 0

我们的前端有这样的Dockerfile:

代码语言:javascript
复制
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并安装依赖项,然后再复制代码?如下所示:

代码语言:javascript
复制
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"]
EN

回答 2

Stack Overflow用户

发布于 2021-03-05 22:37:59

我认为与Dockerfile优化相关的最重要的事情之一是将可能会更改的元素放在容器的未来版本中,这是在代码部分发生任何更改的情况下的最新原因,因为最新的更改不会强制在其他层上进行重新创建。

我认为这就是Dockerfile看起来像第一个示例的原因。关于Dockerfile优化,您可以在这里阅读其他注意事项,例如:https://linuxhint.com/optimizing-docker-images/

票数 1
EN

Stack Overflow用户

发布于 2021-03-07 02:06:10

hadolint/hadolint Dockerfile林特是一个很好的起点。使用Haskell Dockerfile Linter连接您的Dockerfile,即docker run --rm -i hadolint/hadolint < Dockerfile

代码语言:javascript
复制
/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可能如下所示:

代码语言:javascript
复制
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 .

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66493910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档