docker - Openshift - 使用 alpine、java 和 jmeter 运行基本容器

标签 docker kubernetes openshift alpine docker-entrypoint

在 Openshift 环境中(Kubernetes v1.18.3+47c0e71)
我正在尝试运行一个非常基本的容器,其中将包含:

  • Alpine (最新版)
  • JDK 1.8
  • Jmeter 5.3

  • 我只希望它在容器中启动并运行,期望连接从命令行终端运行 Jmeter CLI。
    我已经让它在我的本地 Docker 发行版中完美运行。这是 Dockerfile 内容:
    FROM alpine:latest
    
    ARG JMETER_VERSION="5.3"
    ENV JMETER_HOME /opt/apache-jmeter-${JMETER_VERSION}
    ENV JMETER_BIN  ${JMETER_HOME}/bin
    ENV JMETER_DOWNLOAD_URL https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz
    
    USER root
    
    ARG TZ="Europe/Amsterdam"
    RUN    apk update \
        && apk upgrade \
        && apk add ca-certificates \
        && update-ca-certificates \
        && apk add --update openjdk8-jre tzdata curl unzip bash \
        && apk add --no-cache nss \
        && rm -rf /var/cache/apk/ \
        && mkdir -p /tmp/dependencies  \
        && curl -L --silent ${JMETER_DOWNLOAD_URL} >  /tmp/dependencies/apache-jmeter-${JMETER_VERSION}.tgz  \
        && mkdir -p /opt  \
        && tar -xzf /tmp/dependencies/apache-jmeter-${JMETER_VERSION}.tgz -C /opt  \
        && rm -rf /tmp/dependencies
    
    # Set global PATH such that "jmeter" command is found
    ENV PATH $PATH:$JMETER_BIN
    
    WORKDIR ${JMETER_HOME}
    
    出于某种原因,当我使用先前上传到私有(private) Docker 镜像注册表的确切配置的容器配置 Pod 时,它不起作用。
    这是部署配置(yaml)文件(也非常基本):
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jmeter
      namespace: myNamespace
      labels:
        app: jmeter
        group: myGroup
    spec:
      selector:
        matchLabels:
          app: jmeter
      replicas: 1
      template:
        metadata:
          labels:
            app: jmeter
        spec:
          containers:
            - name: jmeter
              image: myprivateregistry.azurecr.io/jmeter:dev
              resources:
                limits:
                  cpu: 100m
                  memory: 500Mi
                requests:
                  cpu: 100m
                  memory: 500Mi
              imagePullPolicy: Always
          restartPolicy: Always
          imagePullSecrets:
            - name: myregistrysecret
    
    不幸的是,我没有收到任何日志:
    enter image description here
    Pod 事件的截图:
    enter image description here
    不幸的是,两者都无法访问容器的终端:
    enter image description here
    任何想法:
  • 如何获取更多日志?
  • 到底是怎么回事?
  • 最佳答案

    在您的本地机器上,您可能正在使用 docker run -it <my_container_image>或类似的。使用 -it选项将在您的容器中运行交互式 shell,而无需您指定 CMD。并将保持该 shell 作为容器中启动的主要进程运行。所以通过使用这个命令,你基本上已经指定了一个命令。
    Kubernetes 期望容器镜像包含一个在启动时运行的进程 (CMD),并且只要容器处于事件状态(例如 Web 服务器)就会运行。
    在您的情况下,Kubernetes 正在启动容器,但您没有指定启动容器镜像时应该发生什么。这会导致容器立即终止,您可以在上面的事件中看到这一点。因为您使用的是 Deployment ,失败的 Pod 会一次又一次地重新启动。
    一个可能的解决方法是运行 sleep通过指定 command 启动容器中的命令在你的 Pod 中像这样:

    apiVersion: v1
    kind: Pod
    metadata:
      name: command-demo
      labels:
        purpose: demonstrate-command
    spec:
      containers:
      - name: command-demo-container
        image: alpine
        command: ["/bin/sleep", "infinite"]
      restartPolicy: OnFailure
    
    (Kubernetes documentation)
    这将启动 Pod 并立即运行 /bin/sleep infinite命令,导致主进程是 sleep永远不会终止的进程。您的容器现在将无限期运行。现在您可以使用 oc rsh <name_of_the_pod连接到容器并以交互方式运行您想要的任何内容(例如 jmeter )。

    关于docker - Openshift - 使用 alpine、java 和 jmeter 运行基本容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64467992/

    相关文章:

    docker - 我有一个允许的IP范围来配置dockers,并且我想在端口上导出docker daemon

    macos - Docker-Machine坚持创建默认值

    mysqldump 无法通过 openshift 中的套接字连接

    node.js - 如何在OpenShift中配置最新的nodejs?

    docker - Docker上运行的springboot无法从资源中读取文件

    linux - 由在 docker 中运行的 Jenkins 触发的 npm 测试输出中的编码损坏

    Kubernetes ExternalName 服务无法解析

    mysql - 如何为 Spring 和 MySql 设置 Kubernetes

    kubernetes - 使用 kubectl 的用户访问

    google-chrome - 如何将 *.rhcloud.com 导入 Chrome(ium)?