创建弹性搜索图像。非 root 用户和图像大小问题

时间:2020-12-28 11:56:49

标签: docker elasticsearch

解决方案 - 使用多阶段构建文件来显着减小大小。解决方案粘贴在下面

编辑:已经使用默认的弹性搜索图像,但是这个练习的目的是学习Dockerfile的工作。这就是我注意到我的图像比官方图像(742 M)大得多(2.5G)的方式

dockers/containers 领域的新手(直到现在都在使用 vagrants)。

为了更好地理解 Dockerfile 的工作原理,决定创建一个 ES 镜像(类似于我过去为流浪盒创建的镜像)。

有人可以帮助查看 docker 文件并回答遇到的以下问题。

  1. 不允许以 root 身份运行 ES,从 /home/newuser 运行它会出现以下错误。

    我在这里错过了什么?我应该如何创建一个新用户/组来解决这个问题。

newuser@9f5820d430eb:~$ elasticsearch
Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
output:
[0.000s][error][logging] Error opening log file 'logs/gc.log': Permission denied
[0.001s][error][logging] Initialization of output 'file=logs/gc.log' using options 'filecount=32,filesize=64m' failed.
error:
Invalid -Xlog option '-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m', see error log for details.
Error: Could not create the Java Virtual Machine.
  1. dockerfile 正在安装 JDK 和 ES,但镜像大小超过 2GB。这能不能减少。发现了一种叫做多阶段图像的东西。不知道如何在我的 dockerfile 中适应这个概念。

  2. 在 vagrant 条款中,我更新了 /etc/environment 的路径。 这应该为容器做吗?我不确定它是否增加了任何价值。

Docerkfile -

# Base image stage 1
FROM ubuntu

#MAINTAINER demo@gmail.com
LABEL maintainer="demo@foo.com"
############################################
###  Install openjava
############################################

#RUN apt-get update
ARG JAVA_HOME=/opt/java
ARG JDK_PACKAGE=openjdk-14.0.2_linux-x64_bin.tar.gz

# setup paths
ENV JAVA_HOME $JAVA_HOME

# Setup JAVA_HOME, this is useful for docker commandline
ENV PATH $PATH:$JAVA_HOME/bin


## write to environment file for all future sessions
#  sudo /bin/sh -c 'echo JAVA_HOME="/opt/java/" >> /etc/environment'
#  sudo /bin/sh -c '.  /etc/environment ; echo PATH="$JAVA_HOME/bin:$PATH" >> /etc/environment'


## download open java
#  ADD https://download.java.net/java/GA/jdk14.0.2/205943a0976c4ed48cb16f1043c5c647/12/GPL/$JDK_PACKAGE /
#  ADD $JDK_PACKAGE /
COPY $JDK_PACKAGE /

RUN mkdir -p $JAVA_HOME/ && \
    tar -zxf /$JDK_PACKAGE --strip-components 1  -C $JAVA_HOME  && \
    rm -f /$JDK_PACKAGE


############################################
###  Install elastic search
############################################

ARG ES_HOME=/opt/elasticsearch
ARG ES_PACKAGE=elasticsearch-7.10.1-linux-x86_64.tar.gz

# setup paths
ENV ES_HOME $ES_HOME

# Setup ES_HOME, this is useful for docker commandline
ENV PATH $PATH:$ES_HOME/bin

##write to environment file for all future sessions
#sudo /bin/sh -c 'echo ES_HOME="/opt/elasticsearch/" >> /etc/environment'
#sudo /bin/sh -c '.  /etc/environment ; echo PATH="$ES_HOME/bin:$PATH" >> /etc/environment'

## download es
#  ADD https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-linux-x86_64.tar.gz  /
#  ADD $JDK_PACKAGE /
COPY $ES_PACKAGE /

RUN mkdir -p $ES_HOME/  && \
    tar -zxf /$ES_PACKAGE --strip-components 1  -C $ES_HOME  && \
    rm -f /$ES_PACKAGE

# Mount elasticsearch.yml config
ADD config/elasticsearch.yml /elasticsearch/config/elasticsearch.yml
#ADD config/elasticsearch.yml /


############################################
###  Others
############################################


# Expose ports
EXPOSE 9200
EXPOSE 9300


## give permission to entire elasticsearch setup directory
RUN chmod 755 -R $ES_HOME
RUN chmod 755 -R $JAVA_HOME
RUN chmod 755 -R /var/log

# add non root user
RUN useradd newuser --create-home --shell /bin/bash
RUN echo 'newuser:newpassword' | chpasswd
RUN adduser newuser sudo
USER newuser
WORKDIR /home/newuser


# Define default command.
#CMD ["elasticsearch"]

解决方案 -

非root用户的多阶段构建文件

ARG JAVA_HOME=/opt/java
ARG JDK_PACKAGE=openjdk-14.0.2_linux-x64_bin.tar.gz
ARG ES_HOME=/opt/elasticsearch
ARG ES_PACKAGE=elasticsearch-7.10.1-linux-x86_64.tar.gz


#MAINTAINER demo@gmail.com
#LABEL maintainer="demo@foo.com"


############################################
###  Install openjava
############################################

# Base image stage 1
FROM ubuntu as jdk

ARG JAVA_HOME
ARG JDK_PACKAGE

WORKDIR /opt/

## download open java
#  ADD https://download.java.net/java/GA/jdk14.0.2/205943a0976c4ed48cb16f1043c5c647/12/GPL/$JDK_PACKAGE /
#  ADD $JDK_PACKAGE /
COPY $JDK_PACKAGE .

RUN mkdir -p $JAVA_HOME/ && \
    tar -zxf $JDK_PACKAGE --strip-components 1  -C $JAVA_HOME  && \
    rm -f $JDK_PACKAGE

############################################
###  Install elastic search
############################################

# Base image stage 2
From ubuntu as es

#ARG JAVA_HOME
ARG ES_HOME
ARG ES_PACKAGE

WORKDIR /opt/

## download es
#  ADD https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-linux-x86_64.tar.gz  /
#  ADD $JDK_PACKAGE /
COPY $ES_PACKAGE .

RUN mkdir -p $ES_HOME/  && \
    tar -zxf $ES_PACKAGE --strip-components 1  -C $ES_HOME  && \
    rm -f $ES_PACKAGE

# Mount elasticsearch.yml config
ADD config/elasticsearch.yml /opt/elasticsearch/config/elasticsearch.yml

############################################
###  final
############################################

From ubuntu as finalbuild

ARG JAVA_HOME
ARG ES_HOME
ARG ES_PACKAGE

WORKDIR /opt/

# get artifacts from previous stages
COPY --from=jdk $JAVA_HOME $JAVA_HOME
COPY --from=es  $ES_HOME   $ES_HOME

# Setup JAVA_HOME, this is useful for docker commandline
ENV JAVA_HOME $JAVA_HOME
ENV ES_HOME $ES_HOME

# setup paths
ENV PATH $PATH:$JAVA_HOME/bin
ENV PATH $PATH:$ES_HOME/bin

# Expose ports
EXPOSE 9200
EXPOSE 9300

# Define mountable directories.
#VOLUME ["/data"]


## give permission to entire elasticsearch setup directory
RUN useradd newuser --create-home --shell /bin/bash  && \
    echo 'newuser:newpassword' | chpasswd && \
    chown -R newuser $ES_HOME $JAVA_HOME  && \
    chown -R newuser:newuser /home/newuser && \
    chmod 755 /home/newuser
    #chown -R newuser:newuser /home/newuser
    #chown -R newuser /home/newuser  && \

USER newuser

WORKDIR /home/newuser

#RUN  chown -R newuser /home/newuser

#RUN apt-get update && \
#    apt-get install -yq curl

# Define default command.
CMD ["elasticsearch"]

1 个答案:

答案 0 :(得分:1)

docker 的概念是为您准备了大量开箱即用的图像!

您为什么要为 Elasticsearch 这样的通用技术构建自己的 Dockerfile

为什么不简单:

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1

您是否已在本地准备好要运行的图像?

您可以阅读有关使用 docker here 运行 Elasticseach 的更多信息。

顺便说一句,这个图片大小是 ~774MB

编辑:

如果是出于学习目的,我可以推荐 dive,它可以分析烘焙图像(例如 elasticsearch:7.10.1,并向您展示图像构建的每个步骤(换句话说,dockerfile构建了那个镜像)和它开始的基础镜像。

相关问题