2017-10-20 13 views
0

GitLabから最初にapp:rake db:setupを実行して、dbを初期化できます。Kubernetesで別のコマンドでドッキング・コンテナを実行する

私GitLab YAML(INIT-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: 
... 

からスニペットが、私はポッドの状態を確認するとき、私は、次のエラーメッセージが出ます:Dockerfileから

... 
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" 
... 

スニペットをentrypoint.sh

01から

... 
... 
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"] 

スニペット

... 
... 
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と同等であり、argsCMDと同等です。あなたのケースでは、私はあなたが望むと思う:

... 
     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! :)しかし、1つのクエリ:私はデータベースの初期化が起こったが、私はポッドの状態を確認するとき、それは失敗を続けて参照してください。上記のUPDATE_1に 'kubectl describe pod 'の出力を掲載しました。なぜこれが起こっているのか?私はこれを一度だけ実行しなければならなかったが(データベースの初期化のため)、今はデプロイメントを削除しますが、なぜこのエラーが表示されているのかを知りたいと思っていました。また、そのようなワンタイムタスクのために、正しい方法でデプロイメントを作成していますか?私は私のアプローチについて懐疑的だ。 – Technext

+1

最終的にイメージのバージョンを更新し、複数のポッドを実行している場合、デプロイメントの作成はうまくいくと思います。しかし、追加されたエラーはおそらく新しい質問を正当化するだけです。初期のエラーとは関係ない新しいエラーのようです。 –

0

UPDATE:これが正しい答えではありません。アンディ・シンの答えを参照してください。


各コマンドは、コマンド配列内の項目である必要があります。あなたは2つのコマンドを実行したいように、この方法を試してください。

... 
     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: 
... 

あなたはまた、(基本的にはシェルのコンテキストで実行したコマンドを強制的に)1行であなたのapp:rake db:setupコマンドのペアを書くことargsパラメータを使用することができます。

... 
     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

応答@フィジーをありがとう。私もクエリーを投稿した後、数分で[これ](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/)に出くわしました。 :)私はあなたの提案を試み、私のポストを更新しました。 UPDATEセクションを確認してください。 – Technext

+0

@Technext最初のエラーメッセージ(複数のコマンド)は、ポッド自体からではなく、ホストマシン上のそのポッドからログファイルを見つけられないk8からです。 2番目のエラー( 'args'を使用)は、シェルのパスの中にコマンドをトリガするために必要なrubyまたはsthのように見えます。 '/ bin/sh'ではなく'/bin/bash'を実行すると違いがありますか? – fishi

関連する問題