Я пытаюсь докеризовать свое приложение 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@.git
git add remote upstream git@.git

/usr/bin/node server.js

После сборки этого образа и запуска:

docker run --env NODE_ENV=development -p 8080:8080 -t -i 

Получаю:

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. У моего сценария bash неправильный синтаксис?

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

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

Спасибо.

Calvin Hu

Ответов: 10

Ответы (10)

  1. «Permission denied» запрещает запуск вашего скрипта вообще. Таким образом, единственный синтаксис, который может быть уместным, - это синтаксис первой строки («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"]

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

Возможно, это немного глупо, но сообщение об ошибке, которое я получил, было Permission denied, и оно отправило меня по спирали вниз в очень неправильном направлении, чтобы попытаться решить эту проблему. (Вот например)

Я сам даже не добавил ни одного bash-скрипта, думаю, он добавлен изображением nodejs, которое я использую.

FROM node:14.9.0

Я был ошибочно работал, чтобы открыть / подключить порт на моем локальном:

docker run -p 80:80 [name] . # this is wrong!

, что дает

/usr/local/bin/docker-entrypoint.sh: 8: exec: .: Permission denied

Но у вас не должно быть даже точки в конце, она была добавлена ​​в документацию docker-образа другого проекта по ошибке.Вы должны просто запустить:

docker run -p 80:80 [name]

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

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

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

ls -la path/to/directory

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

-rwxrwxr-x

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

chmod +x docker-entrypoint.sh

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

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

Предоставить права на выполнение файлу docker-entrypoint.sh

sudo chmod 775 docker-entrypoint.sh

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

Проверьте, есть ли у исходного файла разрешение.

запустить ls -al

В результате получаем -rw-r - r -,

запустить
chmod + x docker-entrypoint.sh

перед сборкой докера!

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

В моем рабочем каталоге есть два файла: 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

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

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

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

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

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

Если вы по-прежнему получаете ошибки Permission denied, когда вы пытаетесь запустить свой скрипт в точке входа докера, просто попробуйте НЕ использовать форму оболочки из точка входа:

Вместо: ENTRYPOINT ./bin/watcher записать ENTRYPOINT ["./bin/watcher" visible:

https://docs.docker.com/engine/reference/builder/#entrypoint

enter image description here

Точка [.]

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

проблема была

docker run  -p 3000:80 --rm --name test-con test-app .

/ usr / local / bin / docker-entrypoint.sh: 8: exec:.: В доступе отказано

просто удалите точку из конца командной строки:

docker run  -p 3000:80 --rm --name test-con test-app 

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

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

2022 WebDevInsider