Dockerimage работает с извлечением, но не с директивой pull image в файле yml?

#docker #docker-compose #gitlab

# #docker #docker-compose #gitlab

Вопрос:

У меня есть dockerimage в реестре gitlab. когда я (после входа в систему на целевой машине)

docker run -d -p 8081:8080/tcp gitlab.somedomain.com:5050/root/app

приложение laravel доступно, запущено и доступно. Такие вещи, как php artisan config:clear работают. когда я вхожу в контейнер, все выглядит нормально. Но у меня нет запущенных служб. Итак, у меня возникла идея создать файл yml docker-compose run , чтобы настроить все в docker-compose-gitlab.yml

 version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: my-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=***
      - MYSQL_DATABASE=dbname
      - MYSQL_USER=username
      - MYSQL_PASSWORD=***
    volumes:
      - ./data/mysql:/var/lib/mysql
    ports:
      - "3307:3306"

  application:
    image: gitlab.somedomain.com:5050/root/app:latest
    build:
      context: .
      dockerfile: ./Dockerfile
    container_name: my-app
    ports:
      - "8081:8080"
    volumes:
      - .:/application
    env_file: .env.docker
    working_dir: /application
    depends_on:
      - mysql
    links:
      - mysql

 

вызов docker-compose --verbose -f docker-compose-gitlab.yml up показывает мне, что служба mysql создана и работает, приложение, похоже, также создано, но затем завершается сбоем… выход с кодом 0 — дальнейшего сообщения нет.

Если я добавляю команды в свой yml, php artisan config:clear ошибка становится еще более непонятной для меня: он говорит, что не может найти artisan , и кажется, что команда выполняется вне контейнера… выход с кодом 1. (artisan является помощником и выполняется через php)

Когда я вызываю docker-compose с -d помощью, а затем делаю docker ps , я вижу только запущенный mysql, но не приложение.

Когда я использую обе стратегии, проблема в том, что два контейнера не имеют общей сети и поэтому не могут работать вместе.

Что я пропустил? Это неправильная стратегия?

Комментарии:

1. my-app Как вы пытаетесь подключиться из внутреннего контейнера my-mysql в этих 2 разных стратегиях? Здесь есть две ошибки: (1) нет связи между разными сетями ( default bridge автоматически используется docker run ... / user-defined автоматически создается мостом docker-compose up ) и (2) неправильное использование localhost:[your_published_port] )

2. @tgogos можете ли вы уточнить свой вопрос? Я не уверен, что вы имеете в виду. Вся настройка базовой конфигурации yml работала нормально локально.

Ответ №1:

Проблема в том, что я оставляю директиву volume, которая перезаписывает мое приложение entier с пустым каталогом.

Вы можете просто оставить это.

 version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: my-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=***
      - MYSQL_DATABASE=dbname
      - MYSQL_USER=username
      - MYSQL_PASSWORD=***
    volumes:
      - ./data/mysql:/var/lib/mysql
    ports:
      - "3307:3306"

  application:
    image: gitlab.somedomain.com:5050/root/app:latest
    build:
      context: .
      dockerfile: ./Dockerfile
    container_name: my-app
    ports:
      - "8081:8080"
##    volumes:
##      - .:/application ## this would overwrite the app
    env_file: .env.docker
    working_dir: /application
    depends_on:
      - mysql
    links:
      - mysql
 

Ответ №2:

Вы можете отладить сеть контейнеров, в которых перечислены сети docker network ls , а затем, когда будет показан список, проверить сеть compose с docker inspect <ComposeNetworkID> помощью, как только вы убедитесь, что ваши службы не находятся в одной сети, удалите свои контейнеры и воссоздайте их снова с помощью docker-compose -f docker-compose-gitlab.yml up

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

Комментарии:

1. Эта команда не создается сразу. Это основная проблема. Значит, они никогда не будут в одной сети, пока я использую два вызова для создания двух контейнеров, верно? Пожалуйста, прочитайте мою проблему еще раз 🙂