如何在容器优化的操作系统中设置容器ulimit

Vin*_*ent 4 google-compute-engine docker google-container-os

我需要在容器上设置ulimits。例如,docker run --ulimit memlock="-1:-1" <image>。但是,我不确定在Compute Engine上部署容器优化的VM时如何执行此操作,因为它可以处理容器的启动。

我能够使用选项--privileged,-e用于环境变量,甚至是覆盖的CMD来部署VM。如何部署为容器设置了ulimits的VM?

Vin*_*ent 5

我收到了官方答复:

不幸的是,Compute Engine上的容器功能当前不支持为容器设置ulimit选项。

一种解决方法是在容器内设置ulimit。例如:gcloud beta计算实例create-with-container INSTANCE --zone = ZONE --container-image = gcr.io / google-containers / busybox --container-privileged --container-command = sh --container-arg = -c-容器-arg = ulimit \ -n \ 100000

不幸的是,此方法要求以特权用户身份运行容器。

最好的祝福,...

此答复使我得到了启发,可以进行以下工作。创建从您的Docker映像的ENTRYPOINT引用的包装器脚本。在此包装脚本中,在启动受ulimit限制的进程之前,先设置ulimit。

作为一个简单的例子:

$ HOME / example / wrapper.sh

#! /bin/bash

# set memlock to unlimited
ulimit -l unlimited

# start the elasticsearch node 
# (found this from the base images dockerfile on github)
/usr/local/bin/docker-entrypoint.sh eswrapper
Run Code Online (Sandbox Code Playgroud)

$ HOME / example / Dockerfile

FROM docker.elastic.co/elasticsearch/elasticsearch:6.3.2
COPY wrapper.sh .
RUN chmod 777 wrapper.sh
ENTRYPOINT ./wrapper.sh
Run Code Online (Sandbox Code Playgroud)

本地图像构建

docker image build -t gcr.io/{GCLOUD_PROJECT_ID}/example:0.0.0 $HOME/example

部署到gcr.io

docker push gcr.io/{GCLOUD_PROJECT_ID}/example:0.0.0

通过gcloud创建实例

gcloud beta compute instances create-with-container example-instance-1 \
    --zone us-central1-a \
    --container-image=gcr.io/{GCLOUD_PROJECT_ID}/example:0.0.0 \
    --container-privileged \
    --service-account={DEFAULT_COMPUTE_ENGINE_SERVICE_ACC_ID}-compute@developer.gserviceaccount.com \
    --metadata=startup-script="echo 'vm.max_map_count=262144' > /etc/sysctl.conf; sysctl -p;"
Run Code Online (Sandbox Code Playgroud)

请注意以下几点。上面的启动脚本仅对于运行此映像的容器是必需的。该服务帐户是从您的私人Google容器注册表中提取所需的。--container-privileged参数是必不可少的,因为需要运行具有特权的容器才能在其中设置ulimit。

验证是否为您的过程设置了ulimit

在vm HOST上,ps -e找到在包装脚本中执行的进程的PID。在这种情况下,找到命令为java的PID。对于每个PID ,cat /proc/{PID}/limits。在这种情况下,我仅将锁存器设置为无限。您可以看到它确实设置为无限制。