Я пытаюсь докеризовать свое приложение 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@<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.
Я помещаю оболочку в контейнер, и разрешение docker-entrypoint.sh:
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
три вопроса:
У моего сценария bash неправильный синтаксис?
Как изменить разрешение файла bash перед добавлением его в изображение?
Какой лучший способ запустить несколько команд git в точке входа без использования сценария bash?
Спасибо.
.sh
расширение оставляет неверное представление о том, какие интерпретаторы могут его выполнить. Вы можете подумать о том, чтобы убрать это - для команд UNIX не принято иметь расширения (например, вы не запускаетеls.elf
).exec
оболочку? не нужен ли емуbash
префикс.Ответы:
«Permission denied» вообще запрещает запуск вашего скрипта . Таким образом, единственный синтаксис, который может быть уместным, - это синтаксис первой строки («shebang»), который должен выглядеть
#!/usr/bin/env bash
, или#!/bin/bash
, или подобным образом, в зависимости от макета вашей целевой файловой системы.Скорее всего, разрешения файловой системы не разрешают выполнение. Также возможно, что shebang ссылается на что-то, что не является исполняемым, но это гораздо менее вероятно.
Сбитый с толку простотой устранения предыдущих проблем.
Простое чтение
... в том, что сценарий не помечен как исполняемый.
обратится к этому в контейнере. В качестве альтернативы вы можете убедиться, что локальная копия, на которую ссылается Dockerfile, является исполняемой , а затем использовать
COPY
(что явно задокументировано для сохранения метаданных).источник
noexec
флагом, запуститеbash yourscript
вместо./yourscript
.docker build
немедленный контейнер, он работает нормально. Но когда я это делаюdocker run
, выдает такую ошибку. Похоже на волшебный промежуточный контейнер, который у меня есть.У исполняемого файла должны быть установлены разрешения на выполнение, прежде чем вы сможете его выполнить.
На вашем компьютере, на котором вы создаете образ докера (не внутри самого образа докера), попробуйте запустить:
В первом столбце вывода для вашего исполняемого файла (в данном случае docker-entrypoint.sh) должны быть установлены биты исполняемого файла, например:
Если нет, попробуйте:
а затем снова создайте образ докера.
Docker использует собственную файловую систему, но копирует все (включая биты разрешений) из исходных каталогов.
источник
chmod +x docker-entrypoint.sh
на tzhe host на самом деле является рекомендуемым решением, так как это намного проще, чем изменить вашDockerfile
.Я столкнулся с той же проблемой, и она была решена
Для Dockerfile в исходном вопросе это должно быть так:
источник
sh
, игнорируя спецификацию интерпретатора, указанную в его шебанге; поэтому, если он использует#!/bin/bash
, говоря, что он хочет интерпретироваться с помощью bash, это будет проигнорировано и будет интерпретированоsh
вместо этого, тем самым запретив языковые функции, такие как[[ ]]
массивы и т. д.Если вы не используете DockerFile, вы можете просто добавить разрешение в качестве аргумента командной строки bash:
источник
Это старый вопрос, заданный за два года до моего ответа, я все равно опубликую, что сработало для меня.
В моем рабочем каталоге есть два файла: Dockerfile и provision.sh.
Dockerfile:
provision.sh:
Мне удалось сделать файл в контейнере докера исполняемым, установив файл вне контейнера как исполняемый, а
chmod 700 provision.sh
затем запущенныйdocker build .
.источник