在 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"
但这种方法可能会比较麻烦。