首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kubernetes中使用不同的命令运行docker容器

在Kubernetes中使用不同的命令运行docker容器
EN

Stack Overflow用户
提问于 2017-10-20 14:45:36
回答 2查看 1.2K关注 0票数 0

我希望最初从app:rake db:setup中执行GitLab,以便可以初始化db。

来自我的GitLab YAML的片段(init-db.yaml)

代码语言:javascript
复制
...
        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:
...

但是,当我检查吊舱的状态时,我会得到以下错误消息:

代码语言:javascript
复制
...
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的片段

代码语言:javascript
复制
...
...
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的片段

代码语言:javascript
复制
...
...
case ${1} in
  app:init|app:start|app:sanitize|app:rake)
...

更新:当我运行这个时:

代码语言:javascript
复制
command:
        - "app:rake" 
        - "db:setup"

我得到:

代码语言:javascript
复制
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

当我尝试这个:

代码语言:javascript
复制
command:
        - "/bin/sh"
        args:
        - "-c"
        - "app:rake db:setup"

我明白了:/bin/sh: 1: app:rake: not found

链接描述运行app:rake db:setup命令来设置数据库。

我之前尝试在Kubernetes之外运行这个命令,它使用如下代码运行得很好:

代码语言:javascript
复制
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:

代码语言:javascript
复制
$ 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-20 16:43:17

我想这可能是Pod规范的混淆。在Kubernetes中,command相当于码头ENTRYPOINTargs相当于CMD。就你而言,我认为你想:

代码语言:javascript
复制
...
        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:
...
票数 3
EN

Stack Overflow用户

发布于 2017-10-20 15:25:31

更新:--这不是正确的答案。请参考安迪·辛的回答。

每个命令都应该是命令数组中的一个项。当您想要执行两个命令时,请尝试如下:

代码语言:javascript
复制
...
        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上下文中运行):

代码语言:javascript
复制
...
        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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46851649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档