【发布时间】:2021-07-14 17:10:32
【问题描述】:
我有一个大问题,我会尽量简短地解释。我正在端点上运行 cronjob,并希望将该过程容器化。端点需要设置一些环境变量,并且显然是 TOKEN 身份验证,这基本上是我可以 curl POST 或 GET 从 API 获取我想要的内容之前的登录。棘手的部分是 TOKEN 永远不会相同,这意味着我需要运行 curl 命令才能在 pod 运行时获取它。为了确保这些环境变量在运行时存在,我在 cronjob args 字段中注入了一个命令以使其保持运行。当我 ssh 到 pod 时,我所有的 env var 都在那里 ;) 但是 TOKEN :( 。当我从 pod 内部运行 ./run.sh 时,什么也没有发生,这就是令牌未列在 printenv 中的原因。但是,当我从 pod 内部手动运行 command 1 然后 command 2 时,它工作正常。我很困惑,如果可以请帮助我。而不是在 docker 级别在 cmd 中将我的命令作为 bash 运行,我已经看到我可以使用多行块标量从我的 cronjob.yaml 中的run.sh 解析command 1 和command 2,但还没有想到 yaml 格式是多么痛苦。下面是我的代码更多细节:
docker-entrypoint.sh --> 移除
#! /bin/sh
export AWS_REGION=$AWS_REGION
export API_VS_HD=$API_VS_HD
export CONTROLLER_IP=$CONTROLLER_IP
export PASSWORD=$PASSWORD
export UUID=$UUID
Dockerfile
FROM harbor/ops5/private/:device-purge/python38:3.8
# Use root user for packages installation
USER root
# Install packages
RUN yum update -y && yum upgrade -y
# Install curl
RUN yum install curl -y \
&& curl --version
# Install zip/unzip/gunzip
RUN yum install zip unzip -y \
&& yum install gzip -y
# Install wget
RUN yum install wget -y
# Install jq
RUN wget -O jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
RUN chmod +x ./jq
RUN cp jq /usr/bin
# Install aws cli
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install
# Set working directory
WORKDIR /home/app
# Add user
RUN groupadd --system user && adduser --system user --no-create-home --gid user
RUN chown -R user:user /home/app && chmod -R 777 /home/app
# Copy app
COPY ./run.sh /home/app
RUN chmod +x /home/app/run.sh
# Switch to non-root user
USER user
# Run service
CMD ["sh", "-c", "./run.sh"]
run.sh
# Command 1
export TOKEN=`curl -H "Content-Type: application/json" -H "${API_VS_HD}" --request POST --data "{\"providerName\":\"local\",\"username\":\"admin\",\"password\":\"$PASSWORD\",\"deviceId\":\"$UUID\"}" https://$CONTROLLER_IP:444/admin/login --insecure | jq -r '.token'`
# Sleep
sleep 3
# Command 2
curl -k -H "Content-Type: application/json" \
-H "$API_VS_HD" \
-H "Authorization: Bearer $TOKEN" \
-X GET \
https://$CONTROLLER_IP:444/admin/license/users
cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: device-cron-job
namespace: device-purge
spec:
schedule: "*/2 * * * *" # test
jobTemplate:
spec:
template:
spec:
imagePullSecrets:
- name: cron
containers:
- name: device-cron-pod
image: harbor/ops5/private/:device-purge
env:
- name: AWS_REGION
value: "us-east-1"
- name: API_VS_HD
value: "Accept:application/vnd.appgate.peer-v13+json"
- name: CONTROLLER_IP
value: "52.61.245.214"
- name: UUID
value: "d2b78ec2-####-###-###-#########"
- name: PASSWORD
valueFrom:
secretKeyRef:
name: password
key: password
imagePullPolicy: Always
restartPolicy: OnFailure
backoffLimit: 3
【问题讨论】:
标签: bash docker api kubernetes yaml