在 K8s 中的 Docker 容器中执行脚本

在 K8s 中的 Docker 容器中执行脚本

在 k8s/Argo 工作流步骤中执行脚本时,我遇到了一些奇怪的行为。

首先,我启动 Metamap Tagger 服务器(参见下面的代码片段),而不是等到每个服务器完成后再执行下一个命令,它们都会立即启动(我的笨拙解决方案是在/bin/bash/sleep 120每个服务器之间放置一个命令)。

另一个奇怪的是,如果我在设置一堆环境变量的脚本中运行一个脚本(在本例中source set_uima.sh是这样做的),环境变量不会相应地设置。我已经在 k8 工作流之外测试了这一点,一切都按预期工作。

k8 中是否存在某些问题导致该脚本在非 TTY 会话(k8)中的运行方式与在 TTY 会话(从我的本地工作站)中的运行方式不同?

#!/bin/bash

export DATA_DIRECTORY=/data
export METAMAP_OUT=$DATA_DIRECTORY/metamap_out
export SAMPLE_FILE=$DATA_DIRECTORY/nlptab_manifest.txt
export DATA_IN=$DATA_DIRECTORY/in
export METAMAP_HOME=/usr/share/public_mm # /usr/share/public_mm

export JAVA_TOOL_OPTIONS=‘-Xms2G -Xmx6G -XX:MinHeapFreeRatio=25 -XX:+UseG1GC’

##### Start Metamap Tagger Servers #####
skrmedpostctl start

wsdserverctl start

mmserver &


##### Run UIMA against Metamap taggers #####
source ./setup_uima.sh

答案1

你的脚本在 K8s 中的 docker 容器中以没有 TTY 的 bash 运行并不奇怪。

要使用 TTY 启动 pod,需要tty: true在部署中添加:

spec: 
  containers: 
    - name: test 
      tty: true 

然后运行脚本。

您可以在部署中创建环境变量:部署将如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: envtest
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: envtest
    spec:
      containers:
      - name: envtest
        image: gcr.io/<PROJECT_ID>/envtest
        ports:
        - containerPort: 3000
        env:
        - name: DATA_DIRECTORY
          value: "/data"
        - name: METAMAP_OUT
          value: "/data/metamap_out"            
        - name: SAMPLE_FILE
          value: "/data/nlptab_manifest.txt"
        - name: DATA_IN
          value: "/data/in"            
        - name: METAMAP_HOME
          value: "/usr/share/public_mm"
        - name: JAVA_TOOL_OPTIONS
          value: " -Xms2G -Xmx6G -XX:MinHeapFreeRatio=25 -XX:+UseG1GC"

但这种方法可能会比较麻烦。

相关内容