我收到了一份官方回复:
很遗憾,目前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
ulimit -l unlimited
/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设置为无限制。您可以看到它确实被设置为无限制。