2017-05-05 152 views
0

当我在Docker文件中包含以下命令时,出现错误。我正在尝试创建一个用于为Redis创建基础映像的docker文件,并且此命令有助于实现redis性能。在Docker文件中运行命令

RUN echo 4096 > /writable-proc/sys/net/core/somaxconn 

当我尝试建立泊坞窗文件创建映像我得到的错误是:

/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的图像:

#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/ 
+0

你有没有试过将它作为特权运行? http://stackoverflow.com/questions/26177059/refresh-net-core-somaxcomm-or-any-sysctl-property-for-docker-containers –

+2

尝试运行基本映像并检查目录是/ writable-proc/sys/net/core/exsits?否则,首先在添加文件和文本之前创建该目录。 – lvthillo

+0

发布完整的Dockerfile可能会有所帮助。否则,这是一个猜谜游戏。我猜你在'echo'之前调用了'USER something' ... –

回答

2

设置的sysctl只能在运行时与--sysctl选项。从搬运工运行(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 /净/型芯/ SOMAXCONN你可以使用--sysctl net.core.somaxconn=4096

procfs和sysfs中的其他内核参数可能被继承(尽管其他的参数不是),所以你应该在主机上设置它们。

+0

谢谢里卡多。这工作。 “echo”vm.overcommit_memory = 1“>> /etc/sysctl.conf”和“echo never>/sys/kernel/mm/transparent_hugepage/enabled”可以做类似的事情吗? –

+0

尝试在主机中设置它们以查看这些参数是否被继承。作为最后的手段,我会尝试在特权模式下运行容器(可能禁用apparmor/selinux&seccomp)。也请尝试Docker的最新版本,并告诉我们结果。 –

+0

我在Docker论坛上发现了很多关于此主题的讨论。显然,这是无法完成的,如果你是在主机级别上完成的,它可能适用于该主机上的所有码头集装箱。我想我可以在容器内手动运行这些命令。谢谢里卡多。 –