Как подготовить контейнер для подключения к серверу? - PullRequest
1 голос
/ 18 апреля 2020

У меня есть Dockerfile со следующим содержимым:

FROM ubuntu:bionic as builder

ARG DIGITALOCEAN_ACCESS_TOKEN
ARG K8S_CLUSTER
ARG ARGO_SERVER
ARG ARGO_USERNAME
ARG ARGO_PW

RUN apt-get update
RUN apt-get install -y curl

#WORKDIR /app

RUN curl -L https://github.com/digitalocean/doctl/releases/download/v1.41.0/doctl-1.41.0-linux-amd64.tar.gz  | tar xz
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
RUN curl -L https://github.com/argoproj/argo-cd/releases/download/v1.4.3/argocd-linux-amd64 -o argocd

RUN chmod +x ./argocd
RUN chmod +x ./kubectl

RUN mv ./argocd /usr/local/bin/
RUN mv ./kubectl /usr/local/bin/
RUN mv ./doctl /usr/local/bin/


CMD doctl auth init -t ${DIGITALOCEAN_ACCESS_TOKEN}; \
    doctl kubernetes cluster kubeconfig save ${K8S_CLUSTER}; \
    kubectl get svc; \
    argocd login ${ARGO_SERVER} --username ${ARGO_USERNAME} --password ${ARGO_PW} --grpc-web; \
    argocd context; \
    argocd repo list;

ENTRYPOINT ["/usr/local/bin/argocd"] 

Запуск контейнера:

 docker run --rm -it \                                    
        --env=DIGITALOCEAN_ACCESS_TOKEN=c24a7f963ba86e1d38aff12 \
        --env=K8S_CLUSTER=k8s \
        --env=ARGO_SERVER=argocd.pod.io \
        --env=ARGO_USERNAME=user \
        --env=ARGO_PW=password \
        --name argocd \
        argo-cli repo list 

показывает:

FATA[0000] Argo CD server address unspecified  

соединение с сервером должно быть установлено с помощью команд:

CMD doctl auth init -t ${DIGITALOCEAN_ACCESS_TOKEN}; \
    doctl kubernetes cluster kubeconfig save ${K8S_CLUSTER}; \
    kubectl get svc; \
    argocd login ${ARGO_SERVER} --username ${ARGO_USERNAME} --password ${ARGO_PW} --grpc-web; \
    argocd context; \
    argocd repo list; 

То, что я пытаюсь достичь, это когда я передаю аргумент, как я делал это выше с argo-cli repo list, тогда соединение с сервером уже должно быть установлено чтобы получить результат.

1 Ответ

2 голосов
/ 18 апреля 2020

При запуске контейнера Docker любые аргументы, указанные вами в командной строке, будут перезаписаны в CMD.

Из документации CMD :

В Dockerfile может быть только одна инструкция CMD. Если вы укажете более одного CMD, то вступит в силу только последний CMD.

Основная цель CMD - предоставить значения по умолчанию для исполняющего контейнера. Эти значения по умолчанию могут включать исполняемый файл или могут не включать исполняемый файл, и в этом случае вы также должны указать инструкцию ENTRYPOINT.


Чтобы настроить сервер так, как вы пытаетесь это сделать CMD, вы можете создать сценарий оболочки для запуска setup и запустить его в ENTRYPOINT.

создать файл с некоторым именем, скажем, setup_server.sh, с содержанием:

#!/usr/bin/env bash
doctl auth init -t ${DIGITALOCEAN_ACCESS_TOKEN}
doctl kubernetes cluster kubeconfig save ${K8S_CLUSTER}
kubectl get svc
argocd login ${ARGO_SERVER} --username ${ARGO_USERNAME} --password ${ARGO_PW} --grpc-web
argocd context
argocd repo list
"$@"

Скопируйте этот файл в Dockerfile:

COPY setup_server.sh /usr/local/bin

И измените ваш ENTRYPOINT для запуска setup_server.sh до /usr/local/bin/argocd:

ENTRYPOINT setup_server.sh /usr/local/bin/argocd

(все непроверенные)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...