【问题标题】:How to Run a script at the start of Container in Cloud Containers Engine with Kubernetes如何使用 Kubernetes 在 Cloud Containers Engine 中的容器启动时运行脚本
【发布时间】:2016-02-21 07:38:22
【问题描述】:

我正在尝试在使用 Kubernetes 在 Google Cloud Containers 上运行的 docker 容器的开头运行 shell 脚本。我的应用程序目录的结构是这样的。我想在容器的开头运行 prod_start.sh 脚本(虽然我不想把它作为 Dockerfile 的一部分)。当前设置无法使用Command not found file ./prod_start.sh does not exist 启动容器。知道如何解决这个问题吗?

app/
  ...
  Dockerfile
  prod_start.sh
  web-controller.yaml
  Gemfile
  ...

Dockerfile

FROM ruby
RUN mkdir /backend
WORKDIR /backend
ADD Gemfile /backend/Gemfile
ADD Gemfile.lock /backend/Gemfile.lock
RUN bundle install

web-controller.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: backend
  labels:
    app: myapp
    tier: backend
spec:
  replicas: 1
  selector:
    app: myapp
    tier: backend
  template:
    metadata:
      labels:
        app: myapp
        tier: backend
    spec:
      volumes:
      - name: secrets
        secret:
          secretName: secrets
      containers:
      - name: my-backend
        command: ['./prod_start.sh']
        image: gcr.io/myapp-id/myapp-backend:v1
        volumeMounts:
        - name: secrets
          mountPath: /etc/secrets
          readOnly: true
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80
          name: http-server

【问题讨论】:

  • 有什么理由不能只将它包含在 Docker 映像中而不是在生产环境之外使用它吗?
  • 我想我只是不想让 shell 脚本复杂化以检查我是否在生产中,然后基于此从 kubernetes 机密中正确设置环境变量设置。我也将相同的 Dockerfile 用于开发目的,我有一个 docker-compose.yaml,它运行一个 dev_start.sh
  • 您可以只在映像中使用 prod_start.sh 脚本,但在不生产时运行不同的命令,不是吗?
  • 您可以尝试使用脚本的绝对路径吗?

标签: docker kubernetes dockerfile google-kubernetes-engine


【解决方案1】:

经过大量实验,我相信将脚本添加到Dockerfile

ADD prod_start.sh /backend/prod_start.sh

然后在yaml控制器文件中调用这样的命令:

command: ['/bin/sh', './prod_start.sh']

修复它。

【讨论】:

    【解决方案2】:

    您可以将配置映射添加到您的 yaml,而不是添加到您的 dockerfile。

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: backend
      labels:
        app: myapp
        tier: backend
    spec:
      replicas: 1
      selector:
        app: myapp
        tier: backend
      template:
        metadata:
          labels:
            app: myapp
            tier: backend
        spec:
          volumes:
          - name: secrets
            secret:
              secretName: secrets
          - name: prod-start-config
            configMap:
              name: prod-start-config-script
              defaultMode: 0744
          containers:
          - name: my-backend
            command: ['./prod_start.sh']
            image: gcr.io/myapp-id/myapp-backend:v1
            volumeMounts:
            - name: secrets
              mountPath: /etc/secrets
              readOnly: true
            - name: prod-start-config
              mountpath: /backend/
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
            ports:
            - containerPort: 80
              name: http-server
    
    

    然后为您的脚本创建另一个 yaml 文件: 脚本.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata: 
      name: prod-start-config-script
    data:
      prod_start.sh: |
        apt-get update 
    

    部署后脚本将在脚本目录中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-02
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多