【发布时间】:2016-12-17 09:12:23
【问题描述】:
我正在尝试 dockerize 我的 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.
我shell进入容器,docker-entrypoint.sh的权限是:
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
三个问题:
我的 bash 脚本是否有错误的语法?
如何在将 bash 文件添加到图像之前更改其权限?
不使用 bash 脚本在入口点运行多个 git 命令的最佳方法是什么?
谢谢。
【问题讨论】:
-
我们需要查看文件权限才能回答这个问题。
-
顺便说一句,如果这是一个 bash 脚本,而不是 sh 脚本,那么
.sh扩展会让人误解哪些解释器可以执行它。你可能会考虑把它去掉——对于 UNIX 命令来说,有扩展名是不常见的(例如,你不运行ls.elf)。 -
我们可以
exec那样做一个外壳吗?它不需要bash前缀吗? -
@Jean-FrançoisFabre,您的问题到底是什么意思? (我不明白“exec a shell that way”是什么意思——在这种情况下“that way”是什么意思?)
-
愚蠢的问题,顺便说一句——脚本的权限是否正确在你将它们添加到图像中?