首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为服务器连接准备容器?

如何为服务器连接准备容器?
EN

Stack Overflow用户
提问于 2020-04-18 20:33:48
回答 1查看 987关注 0票数 1

我有一个Dockerfile,其内容如下:

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

运行容器:

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

它显示:

代码语言:javascript
复制
FATA[0000] Argo CD server address unspecified  

应该通过以下命令建立到服务器的连接:

代码语言:javascript
复制
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那样,那么应该已经建立到服务器的连接以获得结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-18 20:38:32

在运行Docker容器时,您在命令行中提供的任何参数都将覆盖CMD中的参数。

来自CMD documentation

在Dockerfile中只能有一个CMD指令。如果您列出了多个CMD,那么只有最后一个CMD才会生效。

CMD的主要目的是为正在执行的容器提供默认值。这些默认值可以包括可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定入口点指令。

要像使用CMD一样设置服务器,可以创建一个shell脚本来运行安装程序,并在ENTRYPOINT中运行该脚本。

创建一个名为setup_server.sh的文件,内容如下:

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

代码语言:javascript
复制
COPY setup_server.sh /usr/local/bin

并修改ENTRYPOINT以在/usr/local/bin/argocd之前运行setup_server.sh

代码语言:javascript
复制
ENTRYPOINT setup_server.sh /usr/local/bin/argocd

(全部未经测试)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61295844

复制
相关文章

相似问题

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