在 Docker 文件中运行命令
Posted
技术标签:
【中文标题】在 Docker 文件中运行命令【英文标题】:Running commands in a Docker file 【发布时间】:2017-10-03 18:27:15 【问题描述】:当我在 Docker 文件中包含以下命令时,出现错误。我正在尝试创建一个 docker 文件来为 Redis 创建我的基础映像,并且此命令有助于提高 redis 性能。
RUN echo 4096 > /writable-proc/sys/net/core/somaxconn
当我尝试构建 docker 文件以创建图像时遇到的错误是:
/bin/sh: 1: cannot create /writable-proc/sys/net/core/somaxconn: Directory nonexistent
关于如何运行此命令的任何建议?我实际上想在我的 Dockerfile 中运行以下命令:
RUN echo 4096 > /writable-proc/sys/net/core/somaxconn
RUN echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
RUN echo never > /sys/kernel/mm/transparent_hugepage/enabled
以下是我的 Redis 映像的整个 Docker 文件:
#Download base image ubuntu 16.04
FROM ubuntu:14.04
MAINTAINER George Chilumbu
ENV HOME /root
ENV DEBIAN_FRONTEND noninteractive
#ENV /writable-proc/sys/net/core/somaxconn /proc:/writable-proc
# Set the working directory to /app
WORKDIR ~/
# Redis Cache Server Tuning
RUN mkdir -p /writable-proc/sys/net/core/somaxconn
RUN echo 4096 > /writable-proc/sys/net/core/somaxconn
#RUN echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
#RUN echo never > /sys/kernel/mm/transparent_hugepage/enabled
# Install some necessary software/tools
RUN apt-get update && apt-get install -y \
wget \
vim \
unzip \
inetutils-ping \
inetutils-tools \
net-tools \
dnsutils \
software-properties-common \
python-software-properties \
ntp \
rsyslog \
curl
RUN add-apt-repository ppa:gaod/redis-server \
&& apt-get update \
&& apt-get install -y redis-server \
redis-sentinel \
&& rm /etc/redis/redis.conf \
&& rm /etc/redis/sentinel.conf
RUN mkdir -p /opt/redis/redis_dump
RUN chown redis:redis -R /opt/redis/redis_dump/
【问题讨论】:
您是否尝试过以特权身份运行它? ***.com/questions/26177059/… 尝试运行基础镜像并检查目录 /writable-proc/sys/net/core/ 是否存在?否则,在添加文件和文本之前首先创建该目录。 发布完整的 Dockerfile 可能会有所帮助。否则就是猜谜游戏。我猜你之前打电话给USER something
echo
...
我已经添加了我的整个 Dockerfile。
【参考方案1】:
只能在运行时使用 --sysctl 选项设置 sysctl。来自 docker-run(1) 手册:
Configure namespaced kernel parameters at runtime IPC Namespace - current sysctls allowed: kernel.msgmax, kernel.msgmnb, kernel.msgmni, kernel.sem, kernel.shmall, kernel.shmmax, kernel.shmmni, kernel.shm_rmid_forced Sysctls beginning with fs.mqueue.* If you use the --ipc=host option these sysctls will not be allowed. Network Namespace - current sysctls allowed: Sysctls beginning with net.* If you use the --network=host option these sysctls will not be allowed.
例如,对于 /proc/sys/net/core/somaxconn,您可以使用 --sysctl net.core.somaxconn=4096
。
procfs 和 sysfs 中的其他内核参数可能会被继承(尽管其他的不是),因此您应该在主机上设置它们。
【讨论】:
谢谢里卡多。那行得通。如何为“echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf”和“echo never > /sys/kernel/mm/transparent_hugepage/enabled”做类似的事情? 尝试在host中设置,看看这些参数是否被继承。作为最后的手段,我会尝试以特权模式运行容器(可能禁用 apparmor/selinux 和 seccomp)。也可以试试最新版本的 Docker 并告诉我们结果。 我在 Docker 论坛上发现了很多关于这个主题的讨论。显然,这无法完成,如果您在主机级别执行此操作,它“可能”适用于该主机上的所有 docker 容器。我想我可以在容器内手动运行这些命令。谢谢里卡多。以上是关于在 Docker 文件中运行命令的主要内容,如果未能解决你的问题,请参考以下文章
Docker 从入门到实践系列三 - Docker 常用命令