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.
,