Cal*_* Hu 86 bash shell docker
我正在尝试将我的node.js应用程序停靠.构建容器时,我希望它运行一个git clone然后启动节点服务器.因此,我将这些操作放在.sh脚本中.并在ENTRYPOINT中将脚本作为单个命令运行:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git
#install gcc 4.9
RUN apt-get install -y software-properties-common python-software-properties
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update
RUN apt-get install -y libstdc++-4.9-dev
#install newst nodejs
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD package.json /usr/src/app/
RUN npm install
ADD docker-entrypoint.sh /usr/src/app/
EXPOSE 8080
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)
我的docker-entrypoint.sh看起来像这样:
git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git
/usr/bin/node server.js
Run Code Online (Sandbox Code Playgroud)
构建此图像并运行后:
docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>
Run Code Online (Sandbox Code Playgroud)
我越来越:
docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
Run Code Online (Sandbox Code Playgroud)
我进入容器并且docker-entrypoint.sh的权限是:
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
三个问题:
我的bash脚本是否有错误的语法?
如何在将bash文件添加到图像之前更改bash文件的权限?
在不使用bash脚本的情况下在入口点运行多个git命令的最佳方法是什么?
谢谢.
Cha*_*ffy 133
拒绝"权限"避免你的脚本被调用在所有.因此,这可能是可能有关的唯一语法是第一行(以下简称"认领"),它应该是什么样子#!/usr/bin/env bash,或者#!/bin/bash,或者类似的取决于你的目标的文件系统布局.
很可能文件系统权限未设置为允许执行.shebang也可能引用了不可执行的东西,但这种可能性要小得多.
通过修复先前问题的简易性来扼杀.
简单的阅读
docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
Run Code Online (Sandbox Code Playgroud)
...是脚本未标记为可执行文件.
RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)
将在容器内解决这个问题.或者,您可以确保Dockerfile引用的本地副本是可执行的,然后使用COPY(显式记录以保留元数据).
rum*_*rum 42
问题是由于原始文件没有执行权限。
检查原始文件是否有权限。
跑步ls -al
如果结果得到-rw-r--r--,
跑步
chmod +x docker-entrypoint.sh
在 docker 构建之前!
Sam*_*art 36
可执行文件需要具有执行集的权限才能执行它.
在您正在构建docker镜像的机器中(不在docker镜像本身内)尝试运行:
ls -la path/to/directory
Run Code Online (Sandbox Code Playgroud)
可执行文件的输出的第一列(在本例中为docker-entrypoint.sh)应该具有如下可执行位:
-rwxrwxr-x
Run Code Online (Sandbox Code Playgroud)
如果没有,那么尝试:
chmod +x docker-entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
然后再次构建您的docker镜像.
Docker使用它自己的文件系统,但它会复制源目录中的所有内容(包括权限位).
小智 9
授予文件执行权限docker-entrypoint.sh
sudo chmod 775 docker-entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,并且解决了
ENTRYPOINT ["sh", "/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)
对于原始问题中的Dockerfile,它应类似于:
ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)
这个问题最终困扰了我3个多小时,我刚试过问题出在从末尾删除点。
问题是
docker run -p 3000:80 --rm --name test-con test-app .
Run Code Online (Sandbox Code Playgroud)
/usr/local/bin/docker-entrypoint.sh: 8: exec: .: 权限被拒绝
只需从命令行末尾删除点:
docker run -p 3000:80 --rm --name test-con test-app
Run Code Online (Sandbox Code Playgroud)