Docker-compose "Нет такого файла или каталога" для команды sh

Я настраиваю docker-for-windows на своем частном компьютере.

Когда я недавно установил его на своем офисном ноутбуке, у меня была такая же проблема, но она просто перестала происходить.

Итак, я застрял в этом:

У меня есть проект для работы с докером (на другом моем компьютере) с docker-compose.yml, например:

version: '2'

services:
  web:
    depends_on:
      - db
    build: .
    env_file: ./docker-compose.env
    command: bash ./run_web_local.sh
    volumes:
      - .:/srv/project
    ports:
      - 8001:8001
    links:
      - db
      - rabbit
    restart: always

Dockerfile:

### STAGE 1: Build ###

# We label our stage as 'builder'
FROM node:8-alpine as builder

RUN npm set progress=false && npm config set depth 0 && npm cache clean --force

# build backend
ADD package.json /tmp/package.json
ADD package-lock.json /tmp/package-lock.json
RUN cd /tmp && npm install
RUN mkdir -p /backend-app && cp -a /tmp/node_modules /backend-app

### STAGE 2: Setup ###
FROM python:3

# Install Python dependencies
COPY requirements.txt /tmp/requirements.txt
RUN pip3 install -U pip
RUN pip3 install --no-cache-dir -r /tmp/requirements.txt

# Set env variables used in this Dockerfile (add a unique prefix, such as DOCKYARD)
# Local directory with project source
ENV PROJECT_SRC=.
# Directory in container for all project files
ENV PROJECT_SRVHOME=/srv
# Directory in container for project source files
ENV PROJECT_SRVPROJ=/srv/project

# Create application subdirectories
WORKDIR $PROJECT_SRVPROJ
RUN mkdir media static staticfiles logs

# make folders available for other containers
VOLUME ["$PROJECT_SRVHOME/media/", "$PROJECT_SRVHOME/logs/"]

# Copy application source code to SRCDIR
COPY $PROJECT_SRC $PROJECT_SRVPROJ

COPY --from=builder /backend-app/node_modules $PROJECT_SRVPROJ/node_modules

# Copy entrypoint script into the image
WORKDIR $PROJECT_SRVPROJ

# EXPOSE port 8000 to allow communication to/from server
EXPOSE 8000

CMD ["./run_web.sh"]

docker-compose.env:

C_FORCE_ROOT=True
DJANGO_CELERY_BROKER_URL=amqp://admin:mypass@rabbit:5672//
DJANGO_DATABASE_ENGINE=django.db.backends.mysql
DJANGO_DATABASE_NAME=project-db
DJANGO_DATABASE_USER=project-user
DJANGO_DATABASE_PASSWORD=mypassword
DJANGO_DATABASE_HOST=db
DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost
DJANGO_DEBUG=True
DJANGO_USE_DEBUG_TOOLBAR=off
DJANGO_TEST_RUN=off
PYTHONUNBUFFERED=0

run_web_local.sh:

#!/bin/bash
echo django shell commands
python ./manage.py migrate
echo Starting django server on 127.0.0.1:8000
python ./manage.py runserver 127.0.0.1:8000

Когда я звоню docker-compose up web, я получаю следующую ошибку:

web_1 | bash: ./run_web_local.sh: No such file or directory

  • Я проверил окончания строк, они UNIX
  • файл существует в файловой системе, а также внутри контейнера
  • Я могу вызвать bash run_web_local.sh из моей оболочки Windows PowerShell и внутри контейнера
  • Я изменил разрешения UNIX внутри контейнера
  • Я не включил bash в command в команде docker-compose. И пробовал с обратной косой чертой, без точки и т. д.
  • Я переустановил докер
  • Пробовал перейти на версию 3
  • Докер утверждает, что подключен к моему общему диску C

И: Точно такая же установка работает на другом моем ноутбуке.

Любые идеи? Все два миллиона сообщений на github не решили для меня проблему.

Спасибо!

Обновлять

Удаление volumes: из docker-compose заставляет его работать как указано здесь, но у меня нет мгновенного сопоставления. Для меня это важно ...

Можете ли вы поделиться репозиторием на github, если у вас есть?

Shankar Shastri 30.06.2018 11:44

Извините, это проект компании, поэтому это не открытое репо :( Но я пробовал его с несколькими проектами, у всех одна и та же проблема, и все они работают на другом моем компьютере.

Ron 30.06.2018 11:52

Разве это не означает 'bash -c ./XXX.sh'? Акцент на "-c"

spender 30.06.2018 11:55
bash -c ./run_web_local.sh этого не меняет. Та же ошибка.
Ron 30.06.2018 11:57

поэтому вместо этого попробуйте cat ./run_web_local.sh или ls ./ и посмотрите, действительно ли все обстоит так, как кажется.

spender 30.06.2018 13:04

Чёрт ... ты прав. ls ничего не возвращает. Как это возможно? Любой, почему он работает везде? Я выполнил touch test.txt, и это обнаружилось. Итак, docker-compose действительно думает, что каталог пуст ...

Ron 30.06.2018 13:10

@Ron, вы можете попробовать использовать $ {PWD} /run_web_local.sh, или вы можете распечатать PWD, чтобы вы могли узнать, на какой реальный путь он ссылается.

Shankar Shastri 30.06.2018 13:40

Путь правильный, но пустой. Удаление volumes из docker-compose приводит к его запуску, но я теряю мгновенное отображение. Это было бы важно и для меня.

Ron 30.06.2018 13:42
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
6
8
17 904
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Путь правильный. Локально он находится на одном уровне с docker-compose.yml. Я изменил путь к пути к контейнерам, но это тоже не сработало.

Ron 30.06.2018 11:31

в Dockerfile указать WORKDIR /srv/project?

Riccardo Degan 30.06.2018 11:35

Да, WORKDIR /srv/project

Ron 30.06.2018 11:51

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

Похоже, что команда не выполняется, это каталог, в котором существует run_web_local.sh.

Вы можете проверить текущий рабочий каталог, заменив команду в docker-compose.yml как command: pwd && bash ./run_web_local.sh

Отличная идея! К сожалению, pwd показывает /srv/project, так что это правильно. Какой файл вам нужен?

Ron 30.06.2018 11:50

Dockerfile, который вы создаете, файл env и файл sh.

Rohit Jindal 30.06.2018 12:07
Ответ принят как подходящий

Недавно у меня была такая же проблема, и проблемы исчезают с использованием любого расширенного редактора и изменения окончания строки в стиле unix в сценариях точки входа sh.

В моем случае не знаю, почему, потому что git очень хорошо справляется с этим, в зависимости от хоста Linux или Windows, я оказался в той же ситуации. Если у вас есть файлы, смонтированные в контейнере и хосте (в Windows) это зависит от того, как вы их редактируете, может быть изменено на linux изнутри контейнера, но это влияет на внешний хост Windows. После этого git заявил, что файл .sh изменился, но без добавлений никаких удалений. инструмент графического сравнения показал, что изменилась только новая строка.

Другой обходной путь для устранения неполадок: вы можете запустить сценарий точки входа, переопределенной контейнером, например, с помощью sh, а затем оттуда вы можете проверить в запущенном контейнере, как Linux видит сценарий точки входа, даже если вы можете протестировать его и увидеть точно такую ​​же ошибку

Извините за мой английский, а не за мой родной язык. Надеюсь, это кому-то поможет.

Что я заметил в Ubuntu 18.04.3, так это то, что вам нужно установить docker-compose поверх docker.io, чтобы заставить docker-compose работать.

  • sudo apt установить docker.io
  • sudo apt установить docker-compose

После этого я получил docker-compose [filename.yml], чтобы он работал без проблем.

Перед клонированием репозитория вы должны ввести следующую команду:

git config --global core.autocrlf false

Это изменит конец строки на стиль UNIX.

Затем клонируйте репозиторий и продолжайте.

Было бы неплохо объяснить, почему мы должны это сделать :)

Ron 02.01.2021 11:05

Другие вопросы по теме