我需要在容器上设置ulimits。例如,docker run --ulimit memlock="-1:-1" <image>
。但是,我不确定在Compute Engine上部署容器优化的VM时如何执行此操作,因为它可以处理容器的启动。
我能够使用-privileged,-e(用于环境变量)甚至是覆盖的CMD之类的选项来部署VM。如何部署为容器设置了ulimits的VM?
答案 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。
举个简单的例子:
#! /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
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
docker push gcr.io/{GCLOUD_PROJECT_ID}/example:0.0.0
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。
在虚拟机主机上,ps -e
并找到在包装脚本中执行的进程的PID。在这种情况下,找到命令为java的PID。对于每个PID,cat /proc/{PID}/limits
。在这种情况下,我仅将锁存器设置为无限制。您可以看到它确实设置为无限制。
答案 1 :(得分:3)
在creating a Container Optimized OS或Configuring Options to Run Container的文档中似乎没有用于设置ulimit的文档。
当前,似乎不支持在文档here和here中部署容器优化的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;
}