将logstash的官方docker镜像java版本改为1.8

于由astupidcoder发布

就是很不想污染宿主机环境,这种工具性质的软件基本上都用docker,结果logstash一运行就报错,说是 jdbc-connector-xxx.jar 没法载入。具体异常是:

Failed to load /usr/share/logstash/mysql-connector-java-5.1.7-bin.jar {:exception=>#<TypeError: failed to coerce jdk.internal.loader.ClassLoaders$AppClassLoader to java.net.URLClassLoader>}

一查是JDK版本问题,于是
docker run -it --rm logstash:7.2.0 java --version
一看

openjdk 11.0.3 2019-04-16 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.3+7-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.3+7-LTS, mixed mode, sharing)

JDK11,好烦。于是想着重新build一个镜像给降到JDK8。
首先打开docker hub,找到 logstash:7.2.0 的构建历史,如下:
logstash:7.2.0官方构建历史
然后看一下里面的各种ADD file,看一下有哪些文件被add到镜像里了,看了一下大概包括:

/usr/share/logstash/config/
/usr/share/logstash/pipeline/
/usr/local/bin/

还从网上下载了一个 logstash-7.2.0.tar.gz
我们先把这些东西复制出来
docker run -it --rm -v /Users/hs/dockerVolume/data/elk/logstash/:/usr/share/logstash/out logstash:7.2.0 bash
进去运行cat /etc/redhat-release,可以看到用的基础镜像是centos 7.8.2003
然后把

/usr/share/logstash/config/
/usr/share/logstash/pipeline/
/usr/local/bin/

全都复制到out文件夹,也就是复制到相应挂载的宿主机目录,然后把logstash-7.2.0.tar.gz从官网上下载下来,也放到同一个目录下,然后手写Dockerfile如下:

FROM centos:7.8.2003
RUN yum update -y && yum install -y java-1.8.0-openjdk-devel.x86_64 which && yum clean all
LABEL org.label-schema.schema-version=1.0 org.label-schema.name="CentOS Base Image" org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20190305
RUN groupadd --gid 1000 logstash && adduser --uid 1000 --gid 1000 --home-dir /usr/share/logstash --no-create-home logstash
COPY logstash-7.2.0.tar.gz logstash-7.2.0.tar.gz
RUN tar zxf logstash-7.2.0.tar.gz -C /usr/share && mv /usr/share/logstash-7.2.0 /usr/share/logstash && chown --recursive logstash:logstash /usr/share/logstash/ && chown -R logstash:root /usr/share/logstash && chmod -R g=u /usr/share/logstash && find /usr/share/logstash -type d -exec chmod g+s {} \; && ln -s /usr/share/logstash /opt/logstash
WORKDIR /usr/share/logstash
ENV ELASTIC_CONTAINER=true
ENV PATH=/usr/share/logstash/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
COPY ./config config
COPY ./pipeline pipeline
RUN chown --recursive logstash:root config/ pipeline/
ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
COPY ./bin /usr/local/bin
RUN chmod 0755 /usr/local/bin/docker-entrypoint

EXPOSE 5044 9600
LABEL org.label-schema.schema-version=1.0 org.label-schema.vendor=Elastic org.label-schema.name=logstash org.label-schema.version=7.2.0 org.label-schema.url=https://www.elastic.co/products/logstash org.label-schema.vcs-url=https://github.com/elastic/logstash license="Elastic License"
ENTRYPOINT ["/usr/local/bin/docker-entrypoint"]

大部分是抄原有镜像的命令。
docker build -t logstash:7.2-jdk8 .
构建完成后运行如下:

docker run -it --rm -v /Users/hs/dockerVolume/data/elk/logstash/mysql-connector-java-5.1.7-bin.jar:/usr/share/logstash/mysql-connector-java-5.1.7-bin.jar -v /Users/hs/dockerVolume/data/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf --ip 175.18.255.99 --network elk logstash:7.2-jdk-8

之所以指定network是因为要和mysql和es容器通信。
配置文件/Users/hs/dockerVolume/data/elk/logstash/logstash.conf如下:

input {
  jdbc {
    jdbc_connection_string => "jdbc:mysql://175.18.255.102:3306/movies?characterEncoding=UTF-8&useSSL=false&autoReconnect=true"
    jdbc_user => "root"
    jdbc_password => "root"
    jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-5.1.7-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_default_timezone => "Asia/Shanghai"
    jdbc_paging_enabled => "true"
    jdbc_page_size => "1000"
    statement => "select * from download_info"
    schedule => "* * * * *"
  }
}

output {
  elasticsearch {
    hosts => "175.18.255.100:9200"
    index => "movie_download_info"
    document_id => "%{id}"
  }
  stdout {
    codec => json_lines
  }

}

愉快享受……
本来用docker就是图方便,这下更麻烦了= =


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据。