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

时间:2018-08-15 22:49:43

标签: docker google-compute-engine google-container-os

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

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

3 个答案:

答案 0 :(得分:4)

我收到了官方答复:

  

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

     

一种解决方法是在容器内设置ulimit。例如:   gcloud beta计算实例使用容器创建实例--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限制的进程之前,先设置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

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

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

为您的流程设置了验证ulimit

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

答案 1 :(得分:3)

creating a Container Optimized OSConfiguring Options to Run Container的文档中似乎没有用于设置ulimit的文档。

当前,似乎不支持在文档herehere中部署容器优化的VM时具有自动设置容器限制的选项。您可以在“计算”下为此here提交功能请求。 Configuring Options to Run Container上的文档也不包含该文档。

但是,您可以run containers在容器优化的OS(COS)实例上。因此,您可以使用设置here之类的ulimit来运行docker。

答案 2 :(得分:0)

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

从VM内或容器优化操作系统的启动脚本中

void _setup()
{
    mRtcEngine.OnJoinChannelSuccess = onJoinChannelSuccess;
    mRtcEngine.OnUserJoined = onUserJoined;
    mRtcEngine.OnUserOffline = onUserOffline;
}