如何在Container-Optimized OS中设置容器ulimits

8
我需要在容器中设置ulimits。例如:docker run --ulimit memlock="-1:-1" <image>。然而,当在计算引擎上部署容器优化的虚拟机时,启动容器的方式有所不同。因此,在这种情况下,我不确定如何做到这一点。
我可以使用选项如--privileged、-e用于环境变量,甚至覆盖CMD来部署虚拟机。但是如何为容器设置ulimits呢?
3个回答

7
我收到了一份官方回复:
很遗憾,目前Compute Engine上的容器功能不支持为容器设置ulimit选项。
一个解决方法是在容器内部设置ulimit。例如: gcloud beta compute instances create-with-container INSTANCE --zone=ZONE --container-image=gcr.io/google-containers/busybox --container-privileged --container-command=sh --container-arg=-c --container-arg=ulimit\ -n\ 100000
不幸的是,这种方法需要以特权方式运行容器。
最好的问候,...
这个回复启发我做了以下事情。创建一个包装脚本,从您的Docker镜像的ENTRYPOINT中引用。在这个包装脚本中,在启动受限制进程之前,设置ulimit(s)。
以下是一个快速示例: $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

$HOME/example/Dockerfile

FROM docker.elastic.co/elasticsearch/elasticsearch:6.3.2
COPY wrapper.sh .
RUN chmod 777 wrapper.sh
ENTRYPOINT ./wrapper.sh

本地镜像构建

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;"

请注意以下内容。上述启动脚本仅在运行此镜像的容器时才必要。服务账户对于从您的私有谷歌容器注册表中提取映像是必要的。--container-privileged参数是必要的,因为在特权模式下运行容器是设置其中ulimits所必需的。
验证已为您的进程设置了ulimits
在vm主机上,执行ps -e并找到在包装器脚本中执行的进程的PID。在这种情况下,查找命令为java的PID。对于每个PID,请执行cat /proc/{PID}/limits。在这种情况下,我只将memlock设置为无限制。您可以看到它确实被设置为无限制。

4

创建容器优化操作系统配置选项以运行容器文档中,似乎没有关于设置ulimit的文档。

目前,在部署容器优化的虚拟机时自动设置容器的ulimit选项似乎不受支持,就像文档这里这里所述一样。您可以在“计算”下提交该功能请求此处配置选项以运行容器文档也没有包含该选项。

然而,您可以在容器优化操作系统(COS)实例上运行容器。因此,您可以像这里一样设置docker的ulimit。

谢谢您的回复!请看下面我的答案。它似乎比预期的要简单。 - Vincent

0

我已经成功地使用了以下内容。

从虚拟机内部或容器优化操作系统的启动脚本中:

sudo echo "vm.max_map_count=262144" | tee -a /etc/sysctl.conf
sudo sysctl -p

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接