web-dev-qa-db-fra.com

Démarrer le conteneur kubernetes avec une commande spécifique

En utilisant la flotte, je peux spécifier une commande à exécuter à l'intérieur du conteneur lors de son démarrage. Il semble que cela devrait également être facilement possible avec Kubernetes, mais je n'arrive pas à trouver quoi que ce soit qui dise comment. Il semble que vous devez créer le conteneur spécifiquement pour lancer avec une certaine commande.

Avoir un conteneur à usage général et le lancer avec des arguments différents est beaucoup plus simple que de créer de nombreux conteneurs différents pour des cas spécifiques, ou de définir et d'obtenir des variables d'environnement.

Est-il possible de spécifier la commande exécutée par un pod kubernetes dans l'image Docker au démarrage?

34
static416

Je passe 45 minutes à chercher ça. Ensuite, je poste une question à ce sujet et trouve la solution 9 minutes plus tard.

Il y a un indice sur ce que je voulais dans le Cassandra exemple . La ligne command sous l'image:

id: cassandra
kind: Pod
apiVersion: v1beta1
desiredState:
  manifest:
    version: v1beta1
    id: cassandra
    containers:
      - name: cassandra
        image: kubernetes/cassandra
        command:
          - /run.sh
        cpu: 1000
        ports:
          - name: cql
            containerPort: 9042
          - name: thrift
            containerPort: 9160
        env:
          - key: MAX_HEAP_SIZE
            value: 512M
          - key: HEAP_NEWSIZE
            value: 100M
labels:
  name: cassandra

Malgré la recherche de la solution, ce serait bien s'il y avait un endroit évident dans le projet Kubernetes où je pouvais voir toutes les options possibles pour les différents fichiers de configuration (pod, service, contrôleur de réplication).

40
static416

pour ceux qui cherchent à utiliser une commande avec des paramètres, vous devez fournir un tableau

par exemple

command: [ "bin/bash", "-c", "mycommand" ]

ou aussi

command:
  - "bin/bash"
  - "-c"
  - "mycommand"
30
MrE

Pour répondre à la question de Derek Mahar dans les commentaires ci-dessus:

Quel est le but des arguments si l'on pouvait spécifier tous les arguments en utilisant la commande?

Les Dockerfiles peuvent avoir un Entrypoint uniquement ou un CMD uniquement ou les deux ensemble.

S'ils sont utilisés ensemble, tout ce qui est dans CMD est passé à la commande dans ENTRYPOINT comme arguments, c'est-à-dire.

ENTRPOINT ["print"]
CMD ["hello", "world"]

Donc, dans Kubernetes lorsque vous spécifiez une commande, c'est-à-dire.

    command: ["print"]

Il remplacera la valeur d'Entrypoint dans le Dockerfile du conteneur.

Si vous spécifiez uniquement des arguments, ces arguments seront transmis à la commande qui se trouve dans le point d'entrée du conteneur.

7
Jonathan

Afin de spécifier la commande qu'un pod kubernetes exécute dans l'image Docker au démarrage, nous devons inclure les champs de commande et d'arguments dans le fichier yaml pour que la commande et les arguments soient passés. Par exemple,

apiVersion: v1
kind: Pod
metadata:
    name: command-demo
    labels: 
        purpose: demo-command
spec:
    containers:
    - name: command-demo-container
      image: ubuntu
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo hello; sleep 10;done"]
1
Manya Tripathi

En plus de la réponse acceptée, vous pouvez utiliser des variables avec des valeurs de secrets dans les commandes comme suit:

command: ["/some_command","-instances=$(<VARIABLE_NAME>)"]
        env: 
        - name: <VARIABLE_NAME>
          valueFrom:
            secretKeyRef:
              name: <secret_name>
              key: <secret_key>
0
LeYAUable