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"]