2017-10-20 15 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" 
... 

스 니펫

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

01 23,516,
... 
... 
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

제 생각에 이것은 포드 사양이 혼합되어있을 수 있습니다. 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

감사합니다. @ 앤디에게 도움을 청합니다! :) 하나의 쿼리 : 비록 DB의 초기화가 일어 났지만, 내가 포드의 상태를 확인하면, 계속 실패하는 것을 볼 수 있습니다. 위의 UPDATE_1에 'kubectl describe pod '의 결과를 게시했습니다. 왜 이런 일이 일어나는 지 아십니까? 비록이 작업을 한 번만 실행해야했지만 (db 초기화 작업 이었기 때문에) 지금은 배포를 삭제할 것이지만이 오류가 왜 나타나는지 알고 싶었습니다. 또한 이러한 일회성 작업의 경우 올바른 방법으로 배포를 작성하고 있습니까? 나는 나의 접근 방식에 회의적이다. – 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: 
... 

또한 (기본적으로 쉘 컨텍스트에서 실행하는 명령을 강제로) 한 줄에 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/)을 발견했습니다. :) 나는 당신의 제안을 시도하고 내 게시물을 업데이 트했습니다. 업데이트 섹션을 확인하십시오. – Technext

+0

@Technext 첫 번째 오류 메시지 (여러 명령)는 창 자체가 아닌 k8에서 호스트 컴퓨터의 해당 포드에서 로그 파일을 찾지 못했습니다. 두 번째 오류 ('args' 사용)는 루비 나 sth 명령이 쉘 경로 안에 있지 않은 것처럼 보입니다. '/ bin/sh' 대신'/ bin/bash'를 실행하면 차이가 있습니까? – fishi