Docker服务无法在Container中运行-错误:ulimit:错误设置限制(不允许操作)

时间:2019-08-23 07:37:57

标签: docker kubernetes containers amazon-eks

我正在AWS EKS上运行集群。当前运行的Container(StatefulSet POD)内部已安装Docker。

我在集群中以Kubernetes StatefulSet的身份运行了该映像。这是我的yaml文件,

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: jenkins
  labels:
    run: jenkins
spec:
  serviceName: jenkins
  replicas: 1
  selector:
    matchLabels:
      run: jenkins
  template:
    metadata:
      labels:
        run: jenkins
    spec:
      securityContext:
        fsGroup: 1000
      containers:
      - name: jenkins
        image: 99*****.dkr.ecr.<region>.amazonaws.com/<my_jenkins_image>:0.0.3
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: jenkins-port

在此POD中,我无法运行任何给出错误的docker命令:

  

/etc/init.d/docker:96:ulimit:错误设置限制(不允许操作)

在我的研究中,我经历了一些无法解决我的问题的技巧。 我列出了我尝试过但未解决的解决方案

第一个解决方案:(我在容器内跑了) aricle link

$ sudo service docker stop
$ sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
$ sudo service docker start

第二个解决方案:(我在容器内跑过了)

ulimit -n 65536 in /etc/init.d/docker

第三种解决方案:** article link 这似乎是一个更好的答案,我无法将其添加到配置文件中。 它说,以特权来运行pod。但是无法在*** Kubernetes StatefulSet * 中添加该选项。 因此,我尝试通过在配置文件中添加这样的SecurityContext (securityContext:fsGroup:1000)

spec:
  serviceName: jenkins
  replicas: 1
  selector:
    matchLabels:
      run: jenkins
  template:
    metadata:
      labels:
        run: jenkins
    spec:
      securityContext:
        fsGroup: 1000

它仍然不起作用。

注意:相同的镜像在Docker群集上工作

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

我在Elastic Search上遇到了这个问题,并添加了initContainer可以正常工作。在这种情况下,可能是解决方案:

spec:
  .
  .
  .
  initContainers:  
  - name: increase-fd-ulimit
    image: busybox
    command: ["sh", "-c", "ulimit -n 65536"]
    securityContext:
      privileged: true

如果它不起作用,则有一种second方法可以解决此问题,包括创建新的Dockerfile或更改现有的:

FROM 99*****.dkr.ecr.<region>.amazonaws.com/<my_jenkins_image>:0.0.3
RUN ulimit -n 65536
USER 1000

并将securityContext更改为:

  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    capabilities:
      add: ["IPC_LOCK"]

答案 1 :(得分:1)

POD容器可能需要运行时特权和Linux功能 例如,在docker外容器中,您需要为此容器赋予特权

(defn function [input] ;assume input = '(First (Second (Last))) (last input) )

然后,该泊坞窗可以执行docker run --privileged,以在容器内使用泊坞窗命令

有kubernetes API的Controller和Pod的设置:

service docker start

或创建spec: containers: - name: pause image: k8s.gcr.io/pause securityContext: privileged: true