我正在使用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 回答
我想到了 . 我需要在我的centOS映像中添加一些额外的配置来启用systemd .
现在我的docker容器已启动并正在运行 .
谢谢 :)
根据the fine manual,如果你提供
command:
它取代ENTRYPOINT
,并且args:
取代CMD
,这意味着你运行的最终"command"是:对于领先的
-c
看起来非常可疑,特别是因为你的docker-compose.yml
只包含/usr/sbin/init
.