2016-08-10 4 views
15

Я пытаюсь подключить приложение node.js. Когда контейнер построен, я хочу, чтобы он запустил git clone, а затем запустил сервер узлов. Поэтому я помещал эти операции в сценарий .sh. И запустить скрипт в качестве одной команды в Entrypoint:docker entrypoint running bash script получает «разрешенное отклонение»

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 [email protected]<repo>.git 
git add remote upstream [email protected]<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 

три вопроса:

  1. ли мой Баш скрипт неправильного синтаксиса?

  2. Как изменить разрешение файла bash, прежде чем добавлять его в изображение?

  3. Каков наилучший способ запуска нескольких команд git в точке входа без использования сценария bash?

Спасибо.

+0

Для того, чтобы ответить на этот вопрос, нам необходимо просмотреть разрешения для файлов. –

+0

Кстати, если это скрипт ** bash **, а не ** ** ** **, расширение '.sh' оставляет неверное впечатление о том, какие интерпретаторы могут его выполнить. Вы можете подумать об этом, но для UNIX-команд не принято иметь расширения (например, вы не запускаете 'ls.elf'). –

+0

Можем ли мы «запустить» оболочку таким образом? ему не нужен префикс 'bash'. –

ответ

37
  1. «Доступ запрещен» предотвращает сценарий от того вызывается на всех. Таким образом, единственным синтаксисом, который может быть уместным, является тот факт, что первая строка («shebang»), которая должна выглядеть как #!/usr/bin/env bash, или #!/bin/bash, или аналогичная в зависимости от расположения файловой системы вашей цели.

  2. Скорее всего, разрешения файловой системы не будут установлены для разрешения. Также возможно, что shebang ссылается на то, что не является исполняемым, но это далеко менее вероятно.

  3. Рассматривается простота ремонта предыдущих вопросов.


Простое чтение

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied. 

... в том, что сценарий не отмечен исполняемый файл.

RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"] 

адресует это внутри контейнера. В качестве альтернативы вы можете убедиться, что локальная копия, на которую ссылается файл Docker, является исполняемым, а затем используйте COPY (который явно документирован для сохранения метаданных).

+0

@CalvinHu, я следил за ссылкой для документации, которую вы мне дали, и я не вижу никакого примера использования ADD для копирования в скрипте, который затем выполняется. Не могли бы вы уточнить, где живет этот пример? Документация для 'COPY' является явной, что она копирует metedata (таким образом, разрешения), но я не вижу документацию для' ADD', описывающую это в любом случае. –

+0

Я думаю, что вы правы. Вместо этого я должен использовать COPY. Но, кажется, мне все еще нужно изменить разрешение после COPYing сценария bash. –

+0

У меня есть файл phar, который создает сценарии .bash на основе команды, а затем удаляет их после их завершения. Таким образом, необходимость в том, чтобы общие тома имели набор разрешений для выполнения, - это то, с чем я все еще борюсь. – raupie

10

Исполняемый файл должен иметь разрешения для выполнения, прежде чем вы сможете его выполнить.

В вашей машине, где вы строите докер изображение (не внутри самого Docker изображения) попробуйте запустить:

ls -la path/to/directory 

Первый столбец вывода для исполняемого файла (в данном случае docker-entrypoint.sh) должны иметь исполняемые биты установить что-то вроде:

-rwxrwxr-x 

Если нет, то попробуйте:

chmod +x docker-entrypoint.sh 

, а затем снова создайте изображение докера.

Docker использует собственную файловую систему, но копирует все содержимое (включая разрешения) из исходных каталогов.

+3

'chmod + x docker-entrypoint.sh' на хосте tzhe на самом деле является рекомендуемым решением, так как он намного проще, чем изменение вашего файла Dockerfile. – jotrocken

Смежные вопросы