Skip to content

构建镜像双倍大小(Build Image Size Double) #29970

Closed
@lanmingle

Description

In English? I do not understand, can will help translation, machine translation has a problem.

实例说明:

windows / mac - 1.12.5

在编写 Dockerfile 时,为了优化常常使用一条 RUN 语句运行,好了,现在就说我在 RUN 里面做的事,
下载一个 APP 包,这个包 1G 大小(随意说的),授权 APP 目录,好了到这来结束一层,现在这个构建后大小 1G ,这没有问题正常(注意这里都是 root 用户执行的)。
再之后在外边以 COPY / ADD 一个文件时(越大文件越易发现),这样也没有问题,大小就 1G 多(注意这里都是 root 用户执行的)。

再之后执行 RUN 创建一个运行 lanmingle 用户,并授权相关的目录和文件,构建到这部后发现镜像大小居然翻倍了(经过测试无论是先创建用户或者后创建用户都是出现这样的问题)

问题分析:
由于原文件是 root ,授权后 lanmingle ,docker 认为这两个层有差异,虽然是覆盖原来的,但是层之间会存储两份,一份是 root ,一份是 lanmingle 的,然而明示这是不是想要的,希望这个能忽略这个权限,同时保证也是想要的授权。

目前解决方案:

以 Dockerfile 编写全部一条 RUN 命令全部包括,如果 entrypoint 、配置文件、等都以网络下载的方式,但是这个虽然是非常之优化,可是这样不便于维护与开发。

编写 Dockerfile 时只允许 root 构建镜像,也就是不在 Dockerfile 中出现,允许时通过进入点脚本来控制。

虽然说现在官方的镜像,如 jenkinsci
看起来好像做到了优化,但是这个层还是存在两份。

发现问题的一个 Dockerfile ,无论是否是我编写这个 Dockerfile 不够完美还是怎么样的,这毕竟是不好的,太过容易犯错了,还有推送到私有的镜像库时也是两份。


FROM bestci/openjdk8-jre:latest

MAINTAINER lanmingle<lanmingle@qq.com>

ARG LOGSTASH_TAR_URL="http://192.168.1.200/docker-image-software/logstash/logstash-5.1.1.tar.gz"
ARG LOGSTASH_TAR_DIR_PATH="logstash-5.1.1"
ARG LOGSTASH_INSTALL_DIR="/usr/local/logstash"

ENV \
LS_HOME="$LOGSTASH_INSTALL_DIR" \
LOGSTASH_HOME="$LOGSTASH_INSTALL_DIR" \
LOGSTASH_DATA_PATH="/srv/docker/container/logstash/data" \
LOGSTASH_CONF_PATH="/srv/docker/container/logstash/config" \
LOGSTASH_LOGS_PATH="/srv/docker/container/logstash/logs" \
LOGSTASH_COPY_PATH="/srv/docker/container/logstash/copy"

RUN set -e \

apk add --no-cache \
libzmq \

&& curl -L -N -o /tmp/logstash.tar.gz $LOGSTASH_TAR_URL \

&& tar -zxf /tmp/logstash.tar.gz -C /tmp/ \
&& mv /tmp/$LOGSTASH_TAR_DIR_PATH/ $LOGSTASH_HOME/ \

&& rm -rf \
$LOGSTASH_HOME/LICENSE \
$LOGSTASH_HOME/CONTRIBUTORS \
$LOGSTASH_HOME/NOTICE.TXT \
$LOGSTASH_HOME/*.md \
$LOGSTASH_HOME/bin/*.bat \

&& ln -sf $LOGSTASH_HOME/bin/* /usr/local/bin/ \

&& mkdir -p $LOGSTASH_DATA_PATH/ \
&& mkdir -p $LOGSTASH_CONF_PATH/ \
&& mkdir -p $LOGSTASH_LOGS_PATH/ \
&& mkdir -p $LOGSTASH_COPY_PATH/ \

&& rm -rf $LOGSTASH_HOME/data/ \
&& ln -sf $LOGSTASH_DATA_PATH/ $LOGSTASH_HOME/ \

&& rm -rf $LOGSTASH_HOME/config/ \
&& ln -sf $LOGSTASH_CONF_PATH/ $LOGSTASH_HOME/ \

&& rm -rf $LOGSTASH_HOME/logs/ \
&& ln -sf $LOGSTASH_LOGS_PATH/ $LOGSTASH_HOME/ \

&& rm -rf /var/cache/apk/* /tmp/*

COPY ./docker-entrypoint.sh $LOGSTASH_HOME/docker-entrypoint.sh

COPY ./config/ $LOGSTASH_COPY_PATH/config/

RUN set -e \

&& chmod +x $LOGSTASH_HOME/*.sh \

&& addgroup -g 50 -S docker \
&& adduser -h /home/docker -g docker -s /bin/sh -u 1001 -G docker -S -D docker \

&& chown -hR docker:docker $LOGSTASH_HOME/ \

&& chown -hR docker:docker $LOGSTASH_DATA_PATH/ \
&& chown -hR docker:docker $LOGSTASH_CONF_PATH/ \
&& chown -hR docker:docker $LOGSTASH_LOGS_PATH/ \
&& chown -hR docker:docker $LOGSTASH_COPY_PATH/ \

&& rm -rf /var/cache/apk/* /tmp/*

VOLUME ["$LOGSTASH_DATA_PATH"]

EXPOSE 9600

USER docker

WORKDIR $LOGSTASH_HOME

ENTRYPOINT ["./docker-entrypoint.sh"]

CMD ["./bin/logstash"]




Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions