Docker-compose: пользовательский процесс exec вызвал "нет такого файла или каталога", но файл присутствует - PullRequest
0 голосов
/ 08 июня 2018

Используя следующий файл docker-compose.yml, я создаю стек, который содержит две службы: одна - веб-приложение (называемое брокер ), другая - база данных MySQL (называемая broker_db ).), которое использует веб-приложение.

Я обнаружил, что должен сказать службе брокера подождать, пока MySQL будет инициализирован, и что я мог бы использовать сценарий оболочки, который задерживает посредника от реального запуска веб-приложения до тех пор, пока он не сможет начать использовать базу данных.Тем не менее, я получаю следующую ошибку при запуске docker-compose up:

 broker_1     | standard_init_linux.go:190: exec user process caused "no such file or directory"

Мой docker-compose.yml файл:

version: '3'

services:
  broker-db:
    image: mysql:5.7 # https://store.docker.com/images/mysql
    restart: always
    environment:
      MYSQL_DATABASE: broker # Create a database with name broker during container initialization.
      MYSQL_ROOT_PASSWORD: root # Set root/root as user/password credentials in the container.
    ports:
      - "3302:3306"
    volumes:
      - ./broker-db-volume:/var/lib/mysql
    networks:
      - shared-network

  broker:
    build: .
    command: ["/code/wait-for-mysql-init.sh", "broker-db", "python3", "manage.py", "runserver", "0.0.0.0:8080"]
    volumes:
      - .:/code
    ports:
      - "8080:8080"
    depends_on:
      - broker-db
    restart: always
    networks:
      - shared-network

networks:
  shared-network:

Dockerfile брокера добавляет весь код в своей корневой папке проекта в/code в контейнере Docker, поэтому я не понимаю, почему docker-compose up говорит, что не может найти wait-for-mysql-init.sh:

# Based on https://docs.docker.com/compose/django
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
RUN chmod +x wait-for-mysql-init.sh

Сценарий оболочки выглядит следующим образом:

#!/bin/bash
# wait-for-mysql-init.sh

# Taken from https://stackoverflow.com/a/29793382/5433896.
# Argument handling based on https://unix.stackexchange.com/questions/31414.
# Delayed command execution based on https://docs.docker.com/compose/startup-order/.

set -e # Exit immediately if a command exits with a non-zero status (https://stackoverflow.com/a/19622569/5433896).

DB_HOST="$1" # First argument passed to the script
shift # Forget the first argument, $2 becomes $1, $3 becomes $2 and so on.
command="$@" # All remaining arguments form the command to execute after MySQL is initialized.

while ! mysqladmin ping -h"$DB_HOST" --silent; do
    echo "The initialization of MySQL on $DB_HOST is still ongoing."
    sleep 1
done

echo "The initialization of MySQL on $DB_HOST has finished. It is ready to accept incoming queries."
echo "MySQL is up and running. Executing command $command."
exec $command

Кроме того, сокращенный обзор содержимого проекта моего брокера:

C:\*somepath*\broker
├───broker-application-code
├───broker-db-volume
├───broker
├───.dockerignore
├───docker-compose.yml
├───Dockerfile
├───manage.py
├───requirements.txt
└───wait-for-mysql-init.sh

Итак, скрипт оболочки обязательно присутствует для добавления в образ докера, инструкция ADD находится в Dockerfile, почему тогда оболочкасценарий до сих пор не найден при запуске контейнера брокера?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

В сценарии оболочки исполняемый файл не найден означает, что либо сам сценарий не существует, либо оболочка, запущенная сценарием в первой строке, не существует.На что обратить внимание:

  • существует ли / bin / bash внутри вашего изображения?Должно быть, так как Python 3.6 основан на Debian.
  • Является ли монтирование тома внутри вашего контейнера перезаписывающим каталог?.:/code монтирование тома означает, что все, что вы делаете в образе в этом месте, заменено, но вы, похоже, работаете из того же каталога.
  • - это скрипт, который действительно пытается запустить /bin/bash, илиWindows перевод строки в файл?Linux не понимает перевод строки Windows, поэтому будет искать /bin/bash^M для выполнения, которого не существует.
0 голосов
/ 08 июня 2018

попробуйте COPY вместо ADD

COPY wait-for-mysql-init.sh /code/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...