Docker entrypoint running bash script получает "разрешенное разрешение"

Я пытаюсь подключиться к моему приложению node.js. Когда контейнер построен, я хочу, чтобы он запустил git clone, а затем запустил сервер node. Поэтому я помещал эти операции в .sh script. И запустите script как одну команду в 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 [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

три вопроса:

  • Есть ли у моего bash script неправильный синтаксис?

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

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

Спасибо.

Ответы

Ответ 1

  • "Permission denied" предотвращает вызов вашего script. Таким образом, единственным синтаксисом, который может быть уместным, является тот факт, что первая строка ( "shebang" ), которая должна выглядеть как #!/usr/bin/env bash или #!/bin/bash, или аналогичная в зависимости от расположения вашей целевой файловой системы.

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

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


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

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

... заключается в том, что script не отмечен как исполняемый файл.

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

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

Ответ 2

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

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

ls -la path/to/directory

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

-rwxrwxr-x

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

chmod +x docker-entrypoint.sh

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

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

Ответ 3

Я столкнулся с той же проблемой, и она была решена

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]

Для Dockerfile в исходном вопросе это должно выглядеть так:

ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]

Ответ 4

Если вы не используете DockerFile, вы можете просто добавить разрешение в качестве аргумента командной строки bash:

docker run -t <image>  /bin/bash -c "chmod +x /usr/src/app/docker-entrypoint.sh; /usr/src/app/docker-entrypoint.sh"

Ответ 5

Это старый вопрос, заданный за два года до моего ответа, я собираюсь опубликовать то, что работало для меня в любом случае.

В моем рабочем каталоге у меня есть два файла: Dockerfile & provision.sh

Dockerfile:

FROM centos:6.8

# put the script in the /root directory of the container
COPY provision.sh /root

# execute the script inside the container
RUN /root/provision.sh

EXPOSE 80

# Default command
CMD ["/bin/bash"]

provision.sh:

#!/usr/bin/env bash

yum upgrade

Мне удалось сделать файл в контейнере Docker исполняемым, установив файл вне контейнера как исполняемый файл chmod 700 provision.sh затем запустив docker build. ,