Почему файл не отображается при использовании объемов?

У меня есть следующий Dockerfile: 

```dockerfile
FROM php:7.4-cli

RUN curl -sSLf \
        -o /usr/local/bin/install-php-extensions \
        https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions && \
    chmod +x /usr/local/bin/install-php-extensions

RUN apt-get update && apt-get install -y unzip locales wait-for-it && \
    install-php-extensions bcmath sockets pdo pdo_mysql zip ldap

ENTRYPOINT ["/app/docker/migration/migrate.sh"]
```

Также описан сам сервис в файле:

```yaml
migration:
    env_file:
      - .env
    build:
      dockerfile: docker/migration/Dockerfile
    volumes:
      - ./:/app
    networks:
      mynet:
    depends_on:
      - db
      - app
      - php-fpm
      - nginx
    restart: on-failure
```

На сервере всё работает корректно, но при запуске на Windows я сталкиваюсь с ошибкой, несмотря на то что файл существует: 

```
migration-1              | exec /app/docker/migration/migrate.sh: no such file or directory
```

Как я могу исправить эту ошибку?
  • 23 сентября 2024 г. 17:13
Ответы на вопрос 2
Ошибка `exec /app/docker/migration/migrate.sh: no such file or directory` при использовании Docker на Windows может быть связана с несколькими факторами. Давайте рассмотрим возможные причины и решения:

1. **Проблемы с переводами строк**:
   Windows и Unix-системы используют разные символы для обозначения конца строки. Windows использует `\r\n`, в то время как Unix использует `\n`. Если файл `migrate.sh` был создан или отредактирован в Windows, то у него могут быть символы `\r`, что приводит к тому, что Docker не может его корректно выполнить.

   **Решение**: Убедитесь, что файл `migrate.sh` использует формат Unix. Вы можете использовать утилиты, такие как `dos2unix`, чтобы преобразовать файл:

   ```bash
   dos2unix /path/to/migrate.sh
   ```

2. **Использование неправильных прав доступа**:
   Убедитесь, что файл `migrate.sh` имеет права на выполнение. Во время сборки образа вы можете добавить команду, чтобы установить права:

   ```dockerfile
   RUN chmod +x /app/docker/migration/migrate.sh
   ```

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

3. **Проблемы с монтированием**:
   Убедитесь, что при монтировании тома все файлы корректно копируются и доступны внутри контейнера. Используйте команду `docker-compose exec` для проверки состояния файлов внутри контейнера:

   ```bash
   docker-compose exec migration ls -l /app/docker/migration/
   ```

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

4. **Пути к файлам**:
   Убедитесь, что путь к файлу указан правильно и файл действительно находится там, откуда вы хотите его запустить. Сравните с тем, как вы его указываете в вашем `Dockerfile`.

5. **Ошибки в Dockerfile**:
   Убедитесь, что порядок команд в `Dockerfile` не приводит к тому, что файл не всегда доступен, или он создается/изменяется после команды, которая пытается его запустить.

Если вы выполните эти проверки и предложенные решения, возможно, ошибка будет устранена.
Ответ: Проверить у файла line separator, он должен быть LF, у меня стоял CRLF - из за этого не находил файл. 
Как только я поменял на LF - все заработало.

Похожие вопросы