0

我正在定义一个 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 migration 并通过 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'"

我希望作业可以成功完成,但它失败了,并且 kubectl 记录 job_pod 时的错误信息如下:

错误:执行:“bash -l -c 'cd /home/abc && rvm 使用 2.2.10 --default && rake app:init:test_task'”:stat bash -l -c cd /home/abc && rvm 使用 2.2 .10 --default && rake app:init:test_task': 没有这样的文件或目录

我认为这应该是因为如何编写“命令”部分以使用 gosu 运行多个命令...

谢谢你的帮助!

4

1 回答 1

1

由于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 才能运行命令,因为在 Kubernetes 的容器规范中运行命令时会替换图像entrypoint

于 2019-07-24T10:54:13.653 回答