如何在Kubernetes云容器引擎中的容器启动时运行脚本

7
我正在尝试在使用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 镜像中,只在生产环境中使用呢? - Ian Lewis
我想我只是不想让shell脚本变得复杂,以检查我是否处于生产环境,并根据此设置来自kubernetes secrets的环境变量设置。我在开发过程中也使用相同的Dockerfile,在那里我有一个docker-compose.yaml,它运行一个dev_start.sh - mkhatib
你可以将prod_start.sh脚本放在镜像中,但在非生产环境下运行不同的命令,是吗? - Ian Lewis
你可以尝试使用脚本的绝对路径吗? - Kamran
2个回答

7

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

ADD prod_start.sh /backend/prod_start.sh

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

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

已经解决。


4
你可以将配置映射添加到你的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文件来存储你的脚本:

script.yaml

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

当部署脚本后,它将位于 scripts 目录中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接