Образ Docker работает с неверной командой - PullRequest
0 голосов
/ 24 мая 2019

Что может привести к тому, что образ Docker не будет запускать команду, указанную в файле docker-compose.yaml?

У меня есть такой Dockerfile:

FROM python:2.7
ENV PYTHONUNBUFFERED 1

RUN mkdir -p /code
WORKDIR /code
COPY ./pip-requirements.txt pip-requirements.txt
COPY ./code /code/

RUN pip install --trusted-host pypi.python.org -r pip-requirements.txt

И docker-composeФайл .yaml, например:

version: '3'
services:
  worker:
    container_name: myworker
    image: registry.gitlab.com/mygitlabuser/mygitlabproject:latest
    network_mode: host
    build:
        context: .
        dockerfile: Dockerfile
    command: ./myscript.py --no-wait --traceback

Если я собираю и запускаю это локально с:

docker-compose -f docker-compose.yaml up

Сценарий выполняется в течение нескольких минут, и я получаю ожидаемый результат.Запуск docker ps -a показывает, что контейнер с именем «myworker» был создан, как и ожидалось.

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

Я перестраиваю образ с помощью:

docker-compose -f docker-compose.yaml build

и затем загружаю его с:

docker login registry.gitlab.com
docker push registry.gitlab.com/myuser/myproject:latest

Это успешно, и я подтверждаю, что новое изображение существует в моем gitlabхранилище образов.

Затем я подключаюсь к производственному серверу и загружаю образ с:

docker login registry.gitlab.com
docker pull registry.gitlab.com/myuser/myproject:latest

Опять же, это успешно с отчетом Docker:

Status: Downloaded newer image for registry.gitlab.com/myuser/myproject:latest

Запуск docker images и docker ps -a не отображают ни существующие изображения, ни контейнеры.

Однако здесь все становится странно.Если я тогда попытаюсь запустить этот образ с:

docker run registry.gitlab.com/myuser/myproject:latest

, похоже, ничего не произойдет.Выполнение docker ps -a показывает один контейнер с командой "python2" и именем "gracious_snyder", который не соответствует моему изображению.В нем также говорится, что контейнер вышел сразу после запуска.Запуск docker logs gracious_snyder ничего не показывает.

Что здесь происходит?Почему мой образ не выполняет правильную команду?Это почти как игнорирование всех параметров в моем файле docker-compose.yaml и возврат к настройкам по умолчанию в базовом образе python2.7, но я не знаю, почему это произошло, потому что я построил образ с помощью docker-compose, и онработает нормально локально.

Я использую Docker версии 18.09.6, сборка 481bc77 на локальных и удаленных хостах и ​​сборку docker-версии 1.11.1, сборка 7c5d5e4 на моем локальном хосте.

1 Ответ

2 голосов
/ 24 мая 2019

Без команды (CMD), определенной в вашем файле Docker, вы получаете значение восходящего потока из образа FROM.Файл compose имеет некоторые настройки для создания образа, но большинство значений определяют, как запустить образ.Когда вы запускаете образ напрямую, без файла компоновки (docker vs docker-compose), вы не получаете параметры времени выполнения, определенные в файле compose, только параметры Dockerfile, запеченные в образ.

Исправлениелибо использовать ваш файл компоновки, либо определить CMD внутри Dockerfile, например:

CMD ./myscript.py --no-wait --traceback
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...