2017-02-21 146 views
3

容器我有一個的NodeJS和PM2作爲啓動命令和OpenShift我啓動時獲取此錯誤的容器:權限被拒絕,MKDIR在openshift

Error: EACCES: permission denied, mkdir '/.pm2'

我試過同一圖像上的馬拉松主機供應商,它的工作精細。

我需要用UserIds改變一些東西嗎?

的Dockerfile:

FROM node:7.4-alpine 

RUN npm install --global yarn pm2 

RUN mkdir /src 

COPY . /src 

WORKDIR /src 

RUN yarn install --production 

EXPOSE 8100 

CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"] 

更新
節點的圖像已經創建了一個新用戶 「節點」 與UID 1000以不運行圖像作爲根。
我也嘗試修復權限並將用戶「節點」添加到根組。
而且我告訴哪個目錄應該與ENV VAR使用PM2:

PM2_HOME=/home/node/app/.pm2

,但我仍然得到錯誤:

Error: EACCES: permission denied, mkdir '/home/node/app/.pm2' 

更新Dockerfile:

FROM node:7.4-alpine 

RUN npm install --global yarn pm2 

RUN adduser node root 
COPY . /home/node/app 
WORKDIR /home/node/app 
RUN chmod -R 755 /home/node/app 
RUN chown -R node:node /home/node/app 

RUN yarn install --production 

EXPOSE 8100 

USER 1000 

CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"] 

UPDATE2 感謝格雷厄姆Dumpleton我得到它的工作

FROM node:7.4-alpine 

RUN npm install --global yarn pm2 

RUN adduser node root 
COPY . /home/node/app 
WORKDIR /home/node/app 

RUN yarn install --production 

RUN chmod -R 775 /home/node/app 
RUN chown -R node:root /home/node/app 

EXPOSE 8100 

USER 1000 

CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"] 
+0

哪條RUN線給你這個錯誤?編輯:啊,對不起,運行容器時發生...... –

+0

它看起來像pm2-docker忽略當前的工作目錄。另外,通過檢查圖像歷史記錄(我找不到7.4的Dockerfile),它看起來像預期的工作目錄是/ home/node。也許pm2-docker(從來沒有用過)也期望這是工作目錄。您可以嘗試更改COPY和WORKDIR,以使源位於/ home/node內? –

+0

Dockerfile應該是這樣的:https://github.com/nodejs/docker-node/blob/90d5e3df903b830d039d3fe8f30e3a62395db37e/7.5/alpine/Dockerfile – ivoba

回答

3

OpenShift將運行sudo chmod a=rwx -R .。因此,如果您的應用程序需要以root身份運行,您的應用程序可能會失敗。是否可以將容器配置爲以root身份運行取決於您在羣集中擁有的權限。

設計您的容器和應用程序以便它不必以root身份運行會更好。

一些建議。

  • 創建一個特殊的UNIX用戶來運行應用程序,並設置用戶(使用其UID),在Dockerfile的USER語句。使用戶組成爲根組。

  • 固定權限在/src目錄及其下的所有由特殊用戶擁有的一切。確保一切都是組根。確保需要寫入的內容可寫入組根目錄。

  • 確保您在Dockerfile中將HOME設置爲/src

做完這些後,當OpenShift運行您的容器作爲分配UID,其中組是根,則憑藉着一切是組可寫的,應用程序仍然可以更新/src下的文件。正在設置的HOME變量確保通過代碼寫入主目錄的任何內容都會進入可寫/src區域。

+0

我試圖使用您的所有建議,但它仍然失敗,看到更新的問題 – ivoba

+0

除非你不完全正確。 ''chmod''應該是775,而'chown''應該是''node:root''。並且在所有其他命令運行後執行此操作,因此在「紗線安裝」之後,以防寫入到workdir中。 –

+0

是的,現在它的工作,非常感謝 – ivoba

-1

在默認情況下運行容器中,作爲一個非根用戶工作目錄

+0

我寧願不打開一切的權限。 – ivoba

+0

@ivoda使用a = rw – looffee

+0

@looffee在給出解決方案之前,您應該首先告訴問題是什麼 – VirgileD

-1

你使用的是什麼樣的openshift?

,您可以編輯 「限制」 安全環境約束:

從openshift CLI:

oc edit scc restricted 

而變化:

runAsUser: 
    type: RunAsUSer 

runAsUser: 
    type: RunAsAny 

注意THA t Graham Dumpleton的答案是正確的