当前位置: 首页 > 知识库问答 >
问题:

如何将前台进程添加到Docker容器

巫马善
2023-03-14

在部署时,我面临一个“CrashLoopBackoff”错误。Net核心API和helm升级——安装flextoeco

NAME                            READY   STATUS             RESTARTS        AGE
flextoecoapi-6bb7cdd846-r6c67   0/1     CrashLoopBackOff   4 (38s ago)     3m8s
flextoecoapi-fb7f7b556-tgbrv    0/1     CrashLoopBackOff   219 (53s ago)   10h
mssql-depl-86c86b5f44-ldj48     0/1     Pending  

我已经运行了ks descripe pod flextoecoapi-6bb7cdd846-r6c67,部分输出如下:

Events:
Type     Reason     Age                     From               Message
  ----     ------     ----                    ----               -------
  Normal   Scheduled  5m4s                    default-scheduler  Successfully assigned default/flextoecoapi-6bb7cdd846-r6c67 to fbcdcesdn02
  Normal   Pulling    5m3s                    kubelet            Pulling image "golide/flextoeco:1.1.1"
  Normal   Pulled     4m57s                   kubelet            Successfully pulled image "golide/flextoeco:1.1.1" in 6.2802081s
  Normal   Killing    4m34s                   kubelet            Container flextoeco failed liveness probe, will be restarted
  Normal   Created    4m33s (x2 over 4m57s)   kubelet            Created container flextoeco
  Normal   Started    4m33s (x2 over 4m56s)   kubelet            Started container flextoeco
  Normal   Pulled     4m33s                   kubelet            Container image "golide/flextoeco:1.1.1" already present on machine
  Warning  Unhealthy  4m14s (x12 over 4m56s)  kubelet            Readiness probe failed: Get "http://10.244.6.59:80/": dial tcp 10.244.0.59:80: connect: connection refused
  Warning  Unhealthy  4m14s (x5 over 4m54s)   kubelet            Liveness probe failed: Get "http://10.244.6.59:80/": dial tcp 10.244.0.59:80: connect: connection refused
  Warning  BackOff    3s (x10 over 2m33s)     kubelet            Back-off restarting failed container

从这里的建议来看,我似乎有很多选项要修复,其中最值得注意的是:I)向Dockerfile添加一个命令,以确保有一些前台进程正在运行ii)延长LivenessProbe initialDelaySeconds

我选择了第一个并编辑了我的Dockerfile,如下所示:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:3.1
WORKDIR /app
ENV ASPNETCORE_URLS http://+:5000
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "FlexToEcocash.dll"]
CMD tail -f /dev/null

在此更改之后,我仍然得到相同的错误。

使现代化

跳过:当我不使用helm时,部署工作非常完美,即我可以对部署/服务/节点端口/集群进行kubectl应用,并且API的部署没有问题。

我试图更新价值观。yaml和服务。yaml如下所示,但重新部署后CrashLoopBackOff错误仍然存在:

模板/服务。亚马尔

apiVersion: v1
kind: Service
metadata:
  name: {{ include "flextoeco.fullname" . }}
  labels:
    {{- include "flextoeco.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    {{- include "flextoeco.selectorLabels" . | nindent 4 }}

values.yaml
我在这里明确指定了CPU和内存使用情况

replicaCount: 1
image:
  repository: golide/flextoeco
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "1.1.2"

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  
podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
 
service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: flextoeco.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources:
  limits:
    cpu: 1
    memory: 1Gi
  requests:
    cpu: 100m
    memory: 250Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}

模板/部署。亚马尔

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "flextoeco.fullname" . }}
  labels:
    {{- include "flextoeco.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "flextoeco.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "flextoeco.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      serviceAccountName: {{ include "flextoeco.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
 labels:
        {{- include "flextoeco.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      serviceAccountName: {{ include "flextoeco.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
            ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            tcpSocket:
              port: 8085
            initialDelaySeconds: 300
            periodSeconds: 30
            timeoutSeconds: 20
          readinessProbe:
            tcpSocket:
              port: 8085
            initialDelaySeconds: 300
            periodSeconds: 30
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
        {{- toYaml . | nindent 8 }}
      {{- end }}

共有1个答案

蒯华彩
2023-03-14

部署规范中,我需要在探测中使用端口5000作为containerPort:值和port:。我的应用程序正在监听端口5000:

   - name: http
          containerPort: 5000
          protocol: TCP
      livenessProbe:
        tcpSocket:
          port: 5000
        initialDelaySeconds: 300
        periodSeconds: 30
        timeoutSeconds: 20
      readinessProbe:
        tcpSocket:
          port: 5000
        initialDelaySeconds: 300
        periodSeconds: 30

service.yaml中的配置是正确的:如果部署规范将名称超文本传输协议映射到端口5000,则在服务中引用Target etPort:超文本传输协议是正确的。

 类似资料:
  • 我有一个Sinatra应用程序,在Docker中运行良好: 但是当我尝试添加Redis时: Redis似乎没有启动。 那么,将Redis添加到Ruby()Docker容器中的好方法是什么呢?

  • 问题内容: 我有一个运行着某些进程(uwsgi和celery)的docker容器。我想为这些进程以及它们都属于的工作组创建一个celery用户和uwsgi用户,以便分配权限。 我尝试将和添加到我的Dockerfile中,但这会引起问题,因为这些命令会提示您输入(我已在下面的构建中发布了响应)。 将用户添加到Docker容器以便为在该容器中运行的工作人员设置权限的最佳方法是什么? 我的Docker映

  • 问题内容: 我有一个Docker容器,它是通过在Ubuntu上安装Docker并执行以下操作而创建的: 我立即开始安装Java和其他一些工具,花了一些时间并通过以下方式停止了该容器 然后,我想添加一个卷,并意识到这并不像我想象的那样简单。如果我使用了,那么我将得到一个全新的容器,因此我将安装Java并做我已经做过的事情,然后再到达一个具有已安装卷的容器。 有关从主机安装文件夹的所有文档似乎都暗示了

  • 本文向大家介绍Docker 将容器添加到网络,包括了Docker 将容器添加到网络的使用技巧和注意事项,需要的朋友参考一下 示例 此命令将myAwesomeApp-1容器连接到app-backend网络。将容器添加到用户定义的网络时,嵌入式DNS解析器(它不是功能齐全的DNS服务器,并且不可导出)允许网络上的每个容器解析同一网络上的其他容器。此简单的DNS解析器在默认网桥bridge网络上不可用。

  • 问题内容: 我用mysql启动了一个docker容器。 实际上,我想创建一个新用户和一个新表-我必须在MySQL Workbench中进行操作。 这是我的docker run命令: 我的问题是: 如何添加创建用户和表的sql启动脚本(仅用于容器的首次启动)? 我必须执行哪些步骤? 有人可以帮我吗? 非常感谢! 问题答案: 你需要通过创建用户,ENV VAR和使用量与启动脚本映射目录(,,) 解释来

  • 我创建了一个Docker容器,只需在Ubuntu上安装Docker并执行以下操作: 我立即开始安装Java和一些其他工具,花了一些时间与它,并停止了容器通过 然后我想增加一个卷,并意识到这并不像我想的那样简单。如果我使用,那么我最终会得到一个新的容器,因此我必须安装Java并执行之前已经执行的操作,只需要到达一个具有已装入卷的容器。 所有关于从主机装入文件夹的文档似乎都暗示装入卷是创建容器时可以完