2017-05-05 118 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論壇上發現了很多關於此主題的討論。顯然,這是無法完成的,如果你是在主機級別上完成的,它可能適用於該主機上的所有碼頭集裝箱。我想我可以在容器內手動運行這些命令。謝謝里卡多。 –

相關問題