如何在 Kubernetes 作业中使用 gosu 运行 多个命令

How to run multiple commands with gosu in Kubernetes job

我正在将 Kubernetes 作业定义为 运行 rake 任务,但卡在如何编写命令上...

我是 K8s 的新手,正在尝试 运行 K8s 中的 Rails 应用程序。 在我的 Rails 应用程序 Dockerfile 中,我创建了一个用户,将代码复制到 /home/abc 并在该用户中安装了 rvm 和 rails,还指定了一个入口点和命令:

ENTRYPOINT ["/home/abc/docker-entrypoint.sh"]
CMD bash -l -c "cd /home/abc && rvm use 2.2.10 --default && rake db:migrate && exec /usr/bin/supervisord -c config/supervisord.conf"

在docker-entrypoint.sh中,最后一个命令是

exec gosu abc "$@"

目标是最后,gosu到用户abc,然后运行db迁移,通过supervisord启动服务器。它有效,虽然我不知道这是否是一个好的做法...

现在我想 运行 出于某种目的进行另一项 rake 任务。 首先,我尝试使用 kubectl exec 命令 运行 它:

kubectl exec my-app-deployment-xxxx -- gosu abc bash -l -c 'cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task'

它有效,但它需要知道 pod id,这是动态的。所以我尝试创建一个 K8s 作业并在命令中指定:

containers:
- name: my-app
  image: my-app:v0.2
  command: 
  - "gosu"
  - "abc"
  - "bash -l -c 'cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task'"

我希望作业可以成功完成,但它失败了,ku​​bectl logs job_pod 时的错误信息如下:

error: exec: "bash -l -c 'cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task'": stat bash -l -c cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task': no such file or directory

我想应该是因为如何用 gosu 将 'command' 部分写入 运行 多个命令...

感谢您的帮助!

由于 gosu 将用户名和 Bash shell 作为参数,我会说这是一个而不是三个单独的命令。

鉴于每个容器只能有一个entrypoint,您可以尝试运行如下设置:

containers:
- name: my-app
 image: my-app:v0.2
command: ["/bin/sh", "-c", "gosu username bash -l -c 'cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task'"]

请注意,您必须生成一个新的 TTY 才能 运行 命令作为 the image's entrypoint is replaced when running commands in the container spec in Kubernetes