我正在尝试 dockerize 我的 node.js 应用程序。构建容器后,我希望它运行一个git clone然后启动节点服务器。因此,我将这些操作放在 .sh 脚本中。并在 ENTRYPOINT 中将脚本作为单个命令运行:
git clone
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 命令的最佳方法是什么?
谢谢。
“权限被拒绝”完全阻止您的脚本被调用 。 因此,唯一可能相关的语法是第一行的语法(“shebang”),根据目标的文件系统布局,它应该看起来像#!/usr/bin/env bash、 或或类似的。#!/bin/bash
#!/usr/bin/env bash
#!/bin/bash
很可能文件系统权限未设置为允许执行。shebang 也有可能引用了一些不可执行的东西,但这种可能性要小得多 。
以易于修复先前的问题为依据。
简单的读法
…是该脚本未标记为可执行文件。
RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]
将在容器内解决这个问题。或者,您可以 确保 Dockerfile 引用的本地副本是可执行 的,然后使用COPY(明确记录以保留元数据)。
COPY