2017-10-20 66 views
0

我想從GitLab最初執行app:rake db:setup,因此可以初始化db。用Kubernetes中的不同命令運行碼頭容器

摘錄我GitLab YAML(NIT-db.yaml)

... 
     name: gitlab 
     image: docker.artifactory.abc.net/sameersbn/gitlab:9.3.9 
     command: 
     - app:rake db:setup 
     volumeMounts: 
     - name: gfs-vol-gitlab 
      mountPath: /home/git/data 
     ports: 
     - containerPort: 443 
     resources: {} 
     volumes: 
... 

但是,當我檢查莢的狀態,我得到了以下錯誤消息:

... 
Command: 
     app:rake db:setup 
    State:   Waiting 
     Reason:  CrashLoopBackOff 
    Last State:  Terminated 
     Reason:  ContainerCannotRun 
     Message:  invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"app:rake db:setup\\\": executable file not found in $PATH\"\n" 
... 

Dockerfile片段

... 
... 
EXPOSE 22/tcp 80/tcp 443/tcp 

VOLUME ["${GITLAB_DATA_DIR}", "${GITLAB_LOG_DIR}"] 
WORKDIR ${GITLAB_INSTALL_DIR} 
ENTRYPOINT ["/sbin/entrypoint.sh"] 
CMD ["app:start"] 

段從entrypoint.sh

... 
... 
case ${1} in 
    app:init|app:start|app:sanitize|app:rake) 
... 

UPDATE: 當我運行此:

command: 
     - "app:rake" 
     - "db:setup" 

我得到:

to open log file "/var/log/pods/5b604971-b5ac-11e7-9ee5-021bfed3b32a/gitlab_0.log": open /var/log/pods/5b604971-b5ac-11e7-9ee5-021bfed3b32a/gitlab_0.log: no such file or directory 

當我試試這個:

command: 
     - "/bin/sh" 
     args: 
     - "-c" 
     - "app:rake db:setup" 

我得到:/bin/sh: 1: app:rake: not found

這個link描述了運行app:rake db:setup命令來建立數據庫。

我先前試圖運行Kubernetes超出這個命令,它能正常工作使用的代碼如下所示:

docker run --name gitlab -it --rm \ 
    --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \ 
    --publish 443:443 --publish 80:80 \ 
    --env 'GITLAB_PORT=80' \ 
    --env 'GITLAB_SECRETS_DB_KEY_BASE=64_bit_key_A' \ 
    --env 'GITLAB_SECRETS_SECRET_KEY_BASE=64_bit_key_B' \ 
    --env 'GITLAB_SECRETS_OTP_KEY_BASE=64_bit_key_C' \ 
    --volume /srv/docker/gitlab/gitlab:/home/git/data \ 
    sameersbn/gitlab:9.3.9 app:rake db:setup 

UPDATE_1:

$ kubectl describe pod gitlab-1108406018-3lvh7 
Events: 
    Type  Reason     Age    From      Message 
    ----  ------     ----    ----      ------- 
    Normal Scheduled    18m    default-scheduler   Successfully assigned gitlab-1108406018-3lvh7 to rancher-a 
    Normal SuccessfulMountVolume 18m    kubelet, rancher-a MountVolume.SetUp succeeded for volume "default-token-qv8dm" 
    Normal SuccessfulMountVolume 18m    kubelet, rancher-a MountVolume.SetUp succeeded for volume "pvc-304c48a5-b430-11e7-9ee5-021bfed3b32a" 
    Normal Pulling    17m    kubelet, rancher-a pulling image "docker.artifactory.abc.net/sameersbn/gitlab:9.3.9" 
    Normal Pulled     16m    kubelet, rancher-a Successfully pulled image "docker.artifactory.abc.net/sameersbn/gitlab:9.3.9" 
    Normal Pulled     2m (x7 over 16m) kubelet, rancher-a Container image "docker.artifactory.abc.net/sameersbn/gitlab:9.3.9" already present on machine 
    Normal Created    2m (x8 over 16m) kubelet, rancher-a Created container 
    Normal Started    2m (x8 over 16m) kubelet, rancher-a Started container 
    Warning BackOff    8s (x56 over 15m) kubelet, rancher-a Back-off restarting failed container 
    Warning FailedSync    8s (x56 over 15m) kubelet, rancher-a Error syncing pod 

回答

3

我認爲這可能只是Pod規範的混合。在Kubernetes中,command等效於Docker ENTRYPOINT,而args等效於CMD。在你的情況,我認爲你想要:

... 
     name: gitlab 
     image: docker.artifactory.abc.net/sameersbn/gitlab:9.3.9 
     command: 
     - "/sbin/entrypoint.sh" 
     args: 
     - "app:rake" 
     - "db:setup" 
     volumeMounts: 
     - name: gfs-vol-gitlab 
      mountPath: /home/git/data 
     ports: 
     - containerPort: 443 
     resources: {} 
     volumes: 
... 
+1

你完全正確。 [doc](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes)也顯示了一個關於這個的表格。 – fishi

+0

非常感謝@Andy的幫助! :)雖然有一個查詢:我看到db初始化確實發生,但是當我檢查pod狀態時,它仍然失敗。我在上面的UPDATE_1中發佈了'kubectl describe pod '的輸出。任何想法爲什麼發生這種情況?雖然我只需要運行一次(因爲它只是用於數據庫初始化),我現在將刪除部署,只是想知道爲什麼會出現此錯誤。另外,對於這樣的一次性任務,正在以正確的方式創建部署?我對我的方法持懷疑態度。 – Technext

+1

我認爲如果您最終將更新映像版本並運行多個窗格,那麼創建展開沒問題。但增加的錯誤可能只是一個新的問題。這對我來說似乎是一個新的錯誤,與初始錯誤無關。 –

0

UPDATE:這不是正確的答案。請參閱Andy Shinn的回答。


每個命令應該是命令數組內的一個項目。當您要執行兩個命令,試試這個:

... 
     name: gitlab 
     image: docker.artifactory.abc.net/sameersbn/gitlab:9.3.9 
     command: 
     - "app:rake" 
     - "db:setup" 
     volumeMounts: 
     - name: gfs-vol-gitlab 
      mountPath: /home/git/data 
     ports: 
     - containerPort: 443 
     resources: {} 
     volumes: 
... 

您也可以使用args參數來寫你的app:rake db:setup命令對在同一行(由基本強迫命令,在shell上下文中運行):

... 
     name: gitlab 
     image: docker.artifactory.abc.net/sameersbn/gitlab:9.3.9 
     command: 
     - "/bin/sh" 
     args: 
     - "-c" 
     - "app:rake db:setup" 
     volumeMounts: 
     - name: gfs-vol-gitlab 
      mountPath: /home/git/data 
     ports: 
     - containerPort: 443 
     resources: {} 
     volumes: 
... 
+0

感謝您的反應@魚。發佈我的查詢後,我也遇到了[this](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/)幾分鐘。 :)我嘗試了你的建議並更新了我的帖子。請檢查更新部分。 – Technext

+0

@Technext第一個錯誤消息(多個命令)不是來自於pod本身,而是來自k8s,而不是從主機上的該pod找到日誌文件。第二個錯誤(使用'args')在我看來像ruby或者是觸發命令所必需的,不在shell的路徑中。如果您運行'/ bin/bash'而不是'/ bin/sh',它會有所作爲嗎? – fishi

相關問題