Почему docker -compose не выполняет полностью содержимое контейнера, от которого зависит другой контейнер? - PullRequest
0 голосов
/ 02 августа 2020

Я хочу запустить контейнер Python, зависящий от контейнера базы данных. Но я бы хотел, чтобы контейнер Python запускался только после того, как контейнер сервера sql будет полностью выполнен. Я создал этот файл docker -compose.yml ...

version: "3.2"
  
services:
  sql-server-db:
    restart: always
    build: ./
    container_name: sql-server-db
    image: microsoft/mssql-server-linux:2017-latest
    env_file: /Users/davea/my_project/api/tests/.test_env
    ports:
      - 3900:1433
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=password
      - DB_HOST=0.0.0.0
      - DB_NAME=my_db
      - DB_USER=SA
      - DB_PASS=password
    volumes:
      - ../../CloudDB/CloudDB:/sqlscripts

  python:
    restart: always
    build: ../ 
    environment:
      DEBUG: 'true'
    volumes:
    - /Users/davea/my_project/api:/my-app
    depends_on:
      - sql-server-db

Ниже мой файл Docker для контейнера sql сервера ...

FROM microsoft/mssql-server-linux:latest
  
RUN apt-get update
RUN apt-get install unzip -y

RUN apt-get install tzdata
ENV TZ=America/New_York
RUN ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
RUN date
RUN echo "========="


# Install sqlpackage, needed for deplying dacpac file
RUN wget -progress=bar:force -q -O sqlpackage.zip https://go.microsoft.com/fwlink/?linkid=873926 \
    && unzip -qq sqlpackage.zip -d /opt/sqlpackage \
    && chmod +x /opt/sqlpackage/sqlpackage

# Create work directory
RUN mkdir -p /usr/work

WORKDIR /usr/work

# Copy all SQL scripts into working directory
COPY . /usr/work/

# Grant permissions for the import-data script to be executable
RUN chmod +x /usr/work/import-data.sh

RUN pwd
CMD /bin/bash ./entrypoint.sh

но я заметил что-то странное. Контейнер сервера SQL, похоже, не выполняет полностью все команды в файле точки входа. sh. Я вижу этот вывод ...

...
Removing intermediate container 72550d896ede
 ---> ae6b93ca884e
Step 14/15 : RUN pwd
 ---> Running in f229ef6fec4c
/usr/work
Removing intermediate container f229ef6fec4c
 ---> 7758242bbd95
Step 15/15 : CMD /bin/bash ./entrypoint.sh
 ---> Running in 76fa5c8308e3
Removing intermediate container 76fa5c8308e3
 ---> 567633ad757f
Successfully built 567633ad757f
Successfully tagged microsoft/mssql-server-linux:2017-latest
WARNING: Image for service sql-server-db was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building python
Step 1/17 : FROM python:3.8-slim

Ниже приведено содержимое файла точки входа. sh. Есть ли другой способ структурировать вещи так, чтобы команды выполнялись? Я заметил, что контейнер Python, похоже, не распознает контейнер сервера SQL.

#!/bin/bash -l
  
/usr/work/import-data.sh & /opt/mssql/bin/sqlservr

Есть ли что-то еще, что мне нужно сделать, чтобы получить сценарий оболочки из моего sql контейнер сервера для полного выполнения?

1 Ответ

0 голосов
/ 03 августа 2020

Использование вами опции depends_on неверно или, возможно, работает не так, как вы предполагали. См .: Документация по зависимости_on . В нем четко указано, что он не ждет, пока база данных будет готова в случае sql серверов.

Depends_on подразумевает только ожидание, пока служба не будет запущена и работает.

  • depends_on не ждет, пока db и redis будут «готовы» перед запуском сети - только до тех пор, пока они не будут запущены. Если вам нужно подождать, пока служба будет готова, см. Раздел Управление порядком запуска, чтобы получить дополнительную информацию об этой проблеме и стратегиях ее решения.

Вам будет полезно создать своего рода ручное "ожидание" -for-it "скрипт ( как показано в этом примере docker -compose ) перед запуском python контейнера.

...