首页 文章

Docker-Compose / Kubernetes Yaml文件上的CentOS映像问题

提问于
浏览
0

我正在使用CentOS作为baseimage并启用systemd运行良好的dockerfile,如CentOS官方docker hub图像文档中所建议的那样https://hub.docker.com/_/centos/ .

我将不得不使用以下命令启动我的容器 -

docker run -d -p 8080:8080  -e "container=docker" --privileged=true -d --security-opt seccomp:unconfined --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro myapplicationImage bash -c "/usr/sbin/init"

直到这里,一切都像魅力,我可以运行我的形象,一切正常 . 我正在尝试将我的映像部署到Azure容器服务,因此我尝试创建一个使用此docker映像并创建集群的yaml文件 .

My Yaml file looks like this.

apiVersion: apps/v2beta1
kind: Deployment
metadata:
  name: myapp-test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp-test
    spec:
      containers:
      - name: myapp-test
        image: myappregistry.azurecr.io/myapp-test:1.0
        ports:
        - containerPort: 8080
        args: ["--allow-privileged=true","bash"]
        securityContext:
          capabilities:
            add: ["SYS_ADMIN"]
          privileged: true
        command: [ "-c","/usr/sbin/init" ]
      imagePullSecrets:
        - name: myapp-secret-test      
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-test
spec:
  type: LoadBalancer
  ports:
  - port: 8080
  selector:
    app: myapp-test

这不会激活我的形象 . 以上是kubernetes集群yaml文件 . 我也尝试过Docker-Compose .

version: '3'

services:
  myapp-test:
    build: ./myapp-folder
    environment:
      - container=docker
    volumes:
      - ./sys/fs/cgroup:/sys/fs/cgroup:ro
    ports:
      - "8082:8080"
    privileged: true
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined 
    command: "/usr/sbin/init"

这两种配置都无法创建容器 . 我使用上面docker run time命令中提到的相同配置并将其转换为yaml . 但运行时命令工作,我可以访问我的应用程序,但yaml文件失败 . 我错过了什么吗?

here is my kubernetes error:

➜  $ kubectl get po --watch                 
NAME                            READY     STATUS              RESTARTS   AGE
myapp-test-6957c57f6c-zmbt6   0/1       RunContainerError   4          9m
myapp-test-6957c57f6c-zmbt6   0/1       CrashLoopBackOff   4         9m

➜  $ kubectl get svc --watch                                   
NAME           TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)          AGE
myapp-test   LoadBalancer   10.0.X.XXX   120.XXX.XX.XXX   8080:30150/TCP   12m
kubernetes     ClusterIP      10.0.0.1      <none>         443/TCP          43m

In case of Docker Compose:

容器被踢得很好,但我的应用程序内的服务无法启动 . 我无法访问我的localhost:8080,但容器仍在运行 .

我在考虑在compose或cluster上访问它时是否与我的systemd启用容器有关?

谢谢!

2 回答

  • 1

    我想到了 . 我需要在我的centOS映像中添加一些额外的配置来启用systemd .

    # named (dns server) service
    RUN yum install -y bind bind-utils
    RUN systemctl enable named.service 
    
    # webserver service
    RUN yum install -y nginx
    RUN systemctl enable nginx.service
    
    #Without this, init won't start the enabled services and exec'ing and starting
    them reports "Failed to get D-Bus connection: Operation not permitted".
    VOLUME /run /tmp
    

    现在我的docker容器已启动并正在运行 .

    谢谢 :)

  • 0

    根据the fine manual,如果你提供 command: 它取代 ENTRYPOINT ,并且 args: 取代 CMD ,这意味着你运行的最终"command"是:

    -c /usr/sbin/init --allow-privileged=true bash
    

    对于领先的 -c 看起来非常可疑,特别是因为你的 docker-compose.yml 只包含 /usr/sbin/init .

相关问题