我正在尝试将我的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"]
我的docker-entrypoint.sh看起来像这样:
git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git
/usr/bin/node server.js
构建此图像并运行后:
docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>
我越来越:
docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
我进入容器并且docker-entrypoint.sh的权限是:
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
三个问题:
-
我的bash脚本是否有错误的语法?
-
如何在将bash文件添加到图像之前更改bash文件的权限?
-
在不使用bash脚本的情况下,在入口点运行多个git命令的最佳方法是什么?
谢谢 .
3 回答
"Permission denied"会阻止您的脚本被调用 . 因此,唯一可能相关的语法是第一行("shebang")的语法,它应该看起来像
#!/usr/bin/env bash
,或#!/bin/bash
,或类似的,具体取决于目标的文件系统布局 .很可能文件系统权限未设置为允许执行 . 它's also possible that the shebang references something that isn' t可执行,但这不太可能 .
轻松修复先前的问题 .
简单的阅读
...是脚本未标记为可执行文件 .
将在容器内解决这个问题 . 或者,您可以确保Dockerfile引用的本地副本是可执行的,然后使用
COPY
(显式记录以保留元数据) .可执行文件需要具有执行集的权限才能执行它 .
在您正在构建docker镜像的机器中(不在docker镜像本身内)尝试运行:
可执行文件的输出的第一列(在本例中为docker-entrypoint.sh)应该具有如下可执行位:
如果没有,那么尝试:
然后再次构建您的docker镜像 .
Docker使用它自己的文件系统,但它从源目录复制所有内容(包括权限位) .
我遇到了同样的问题并且解决了
对于原始问题中的Dockerfile,它应该是: