контейнер docker не удается запустить с ошибкой: такого файла или каталога нет

#docker #containers

Вопрос:

я создаю образ докера, используя следующий файл докера

 FROM java:8-jdk
ENV DOCKER_HOME /docker
ENV CRAWLER_HOME /docker/crawler
RUN groupadd crawler amp;amp; useradd -g crawler crawler
RUN mkdir -p ${DOCKER_HOME}
RUN mkdir -p ${CRAWLER_HOME}
COPY ./ ${CRAWLER_HOME}
RUN ls -la ${CRAWLER_HOME}/*
RUN chown -R crawler:crawler ${DOCKER_HOME} amp;amp; chmod -R 755 ${DOCKER_HOME}
WORKDIR $CRAWLER_HOME
ENTRYPOINT [ "/docker/crawler/docker/Entrypoint.sh" ]
 

когда я запускаю изображение без опции-v, оно отлично работает(docker запускает sampleimage:1.0). Но когда я запускаю с-v, это приводит к следующей ошибке

 docker run -v ~/docker:/docker sampleimage:1.0 
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: 
starting container process caused: exec: "/docker/crawler/docker/Entrypoint.sh": stat 
/docker/crawler/docker/Entrypoint.sh: no such file or directory: unknown.
ERRO[0000] error waiting for container: context canceled   
 

при создании изображения я попытался перечислить файл в CRAWLER_HOME и Entrypoint.sh файл присутствует. Не удалось выяснить, почему он не выдает такой файл или каталог во время работы.

Комментарии:

1. ~/docker/crawler/docker/Entrypoint.sh Существует ли файл на вашем хосте? Если да, то какова первая строка?

2. Зачем вы увеличиваете громкость? Есть ли какая-то конкретная причина для этого?

3. @BMitch ~/docker/crawler/docker/Entrypoint.sh отсутствует в хосте, но присутствует в изображении. содержимое плитки Entrypoint.sh #!/bin/sh set -x set -e set — /docker/crawler/docker/start.sh «$@» exec «$@»

4. @Hisham я хочу предварительно просмотреть журналы локально на главной машине.

Ответ №1:

/docker/crawler/docker/Entrypoint.sh не присутствует в хосте, но присутствует в изображении.

Монтирование тома с использованием тех же методов ядра, которые используются для монтирования файловой системы в Linux в других местах. При монтировании поверх каталога, содержащего содержимое, это содержимое не отображается, пока существует монтирование. Весь доступ к каталогу осуществляется через смонтированную файловую систему. Это означает, что вы не объединяете то, что на изображении, с тем, что находится на хосте, вместо этого вы будете видеть только то, что находится в томе.

Полуисключением из этого является монтирование именованных томов. В этом случае именованное монтирование инициализируется при первом использовании с содержимым образа. Затем, продвигаясь вперед, это именованное монтирование действует так же, затеняя содержимое образа, хотя это не так очевидно, поскольку файлы с образа были скопированы в том. Обратите внимание, что эта инициализация происходит только тогда, когда именованный том пуст/новый и контейнер создан, и не запускается при каждом использовании тома, поэтому вы не будете автоматически вносить изменения в изображение при последующем запуске.

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