Я настраиваю 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
bash run_web_local.sh из моей оболочки Windows PowerShell и внутри контейнераbash в command в команде docker-compose. И пробовал с обратной косой чертой, без точки и т. д.И: Точно такая же установка работает на другом моем ноутбуке.
Любые идеи? Все два миллиона сообщений на github не решили для меня проблему.
Спасибо!
Обновлять
Удаление volumes: из docker-compose заставляет его работать как указано здесь, но у меня нет мгновенного сопоставления. Для меня это важно ...
Извините, это проект компании, поэтому это не открытое репо :( Но я пробовал его с несколькими проектами, у всех одна и та же проблема, и все они работают на другом моем компьютере.
Разве это не означает 'bash -c ./XXX.sh'? Акцент на "-c"
bash -c ./run_web_local.sh этого не меняет. Та же ошибка.
поэтому вместо этого попробуйте cat ./run_web_local.sh или ls ./ и посмотрите, действительно ли все обстоит так, как кажется.
Чёрт ... ты прав. ls ничего не возвращает. Как это возможно? Любой, почему он работает везде? Я выполнил touch test.txt, и это обнаружилось. Итак, docker-compose действительно думает, что каталог пуст ...
@Ron, вы можете попробовать использовать $ {PWD} /run_web_local.sh, или вы можете распечатать PWD, чтобы вы могли узнать, на какой реальный путь он ссылается.
Путь правильный, но пустой. Удаление volumes из docker-compose приводит к его запуску, но я теряю мгновенное отображение. Это было бы важно и для меня.


Это может быть связано с тем, что файл bash находится не в корневом пути или в корневом пути рабочего каталога. Проверьте, где он находится в контейнере, и убедитесь, что путь правильный.
Путь правильный. Локально он находится на одном уровне с docker-compose.yml. Я изменил путь к пути к контейнерам, но это тоже не сработало.
в Dockerfile указать WORKDIR /srv/project?
Да, WORKDIR /srv/project
Если возможно, предоставьте все файлы, связанные с этим, чтобы я мог воспроизвести проблему.
Похоже, что команда не выполняется, это каталог, в котором существует run_web_local.sh.
Вы можете проверить текущий рабочий каталог, заменив команду в docker-compose.yml как
command: pwd && bash ./run_web_local.sh
Отличная идея! К сожалению, pwd показывает /srv/project, так что это правильно. Какой файл вам нужен?
Dockerfile, который вы создаете, файл env и файл sh.
Недавно у меня была такая же проблема, и проблемы исчезают с использованием любого расширенного редактора и изменения окончания строки в стиле unix в сценариях точки входа sh.
В моем случае не знаю, почему, потому что git очень хорошо справляется с этим, в зависимости от хоста Linux или Windows, я оказался в той же ситуации. Если у вас есть файлы, смонтированные в контейнере и хосте (в Windows) это зависит от того, как вы их редактируете, может быть изменено на linux изнутри контейнера, но это влияет на внешний хост Windows. После этого git заявил, что файл .sh изменился, но без добавлений никаких удалений. инструмент графического сравнения показал, что изменилась только новая строка.
Другой обходной путь для устранения неполадок: вы можете запустить сценарий точки входа, переопределенной контейнером, например, с помощью sh, а затем оттуда вы можете проверить в запущенном контейнере, как Linux видит сценарий точки входа, даже если вы можете протестировать его и увидеть точно такую же ошибку
Извините за мой английский, а не за мой родной язык. Надеюсь, это кому-то поможет.
Что я заметил в Ubuntu 18.04.3, так это то, что вам нужно установить docker-compose поверх docker.io, чтобы заставить docker-compose работать.
После этого я получил docker-compose [filename.yml], чтобы он работал без проблем.
Перед клонированием репозитория вы должны ввести следующую команду:
git config --global core.autocrlf false
Это изменит конец строки на стиль UNIX.
Затем клонируйте репозиторий и продолжайте.
Было бы неплохо объяснить, почему мы должны это сделать :)
Можете ли вы поделиться репозиторием на github, если у вас есть?