Не могу запустить образ докера

Во-первых, извините, если мой вопрос покажется слишком простым или глупым. Я новичок в докере. Я создал свой образ докера и передал несколько файлов jar, которые должны запускаться сразу при запуске контейнера. Я хочу запустить скрипт "serve.sh" сразу при запуске контейнера. Мне удалось хорошо создать изображения, но когда я запускаю контейнер, он выдает мне эту ошибку:

C:\Program Files\Docker\Docker\resources\bin\docker.exe: ответ об ошибке от демона: сбой создания среды выполнения OCI: container_linux.go:349: запуск процесса контейнера вызвал "exec: \"-it\": исполняемый файл не найдено в $PATH": неизвестно.

Вот команда, которую я использую для запуска образа, который я создал:

docker run b24b37614e1a -it

Вот мой файл докера:

FROM openjdk:8-jdk-alpine
EXPOSE 8080:8080
COPY apigateway-0.0.1-SNAPSHOT.jar apigateway.jar
COPY authservice-0.0.1-SNAPSHOT.jar authservice.jar
COPY institutionsservice-0.0.1-SNAPSHOT.jar institutionsservice.jar
COPY messagesservice-0.0.1-SNAPSHOT.jar messagesservice.jar
COPY postsservice-0.0.1-SNAPSHOT.jar postsservice.jar
COPY userservice-0.0.1-SNAPSHOT.jar userservice.jar
COPY serve.sh serve.sh
CMD [ "bash" "./serve.sh" ] 

Пожалуйста, что я делаю неправильно? я новичок в докере


person John Code    schedule 27.05.2020    source источник
comment
Это работает с CMD [ "/bin/bash" "./serve.sh" ]? Или же, я не уверен, но есть вероятность, что альпийские изображения не содержат bash. Они разработаны, чтобы быть крошечными.   -  person MC Emperor    schedule 28.05.2020
comment
Эх, тоже не заметил твой порядок аргументов. Это должно быть действительно docker run -it b24b37614e1a.   -  person MC Emperor    schedule 28.05.2020
comment
Возможный дубликат: stackoverflow.com/q/50761557/596285   -  person BMitch    schedule 28.05.2020


Ответы (3)


Имейте в виду, что порядок аргументов docker имеет значение:
вы написали docker run b24b37614e1a -it, который отличается от

docker run -it b24b37614e1a

Надеюсь, это решит вашу проблему :)

person Luca Fabbian    schedule 27.05.2020

Есть несколько вещей, которые вы должны исправить. Во-первых, это формат CMD, который должен быть

CMD instruction has three forms:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
CMD [ "/bin/bash" , "./serve.sh" ] 

Другое дело, Когда вы делаете docker run, инструкции

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

что означает, что все параметры должны быть до IMAGE, а в вашем случае it появляется после IMAGE.

Правильная команда должна быть

docker run -it b24b37614e1a

Кстати, небольшой вопрос, почему вы хотите запустить интерактивный контейнер этого приложения. В идеале должно быть что-то вроде

docker run -p $HOST_PORT:$APP_PORT b24b37614e1a

-p => Опубликовать порт(ы) контейнера на хосте

а затем вы можете получить доступ к своему приложению localhost:$HOST_PORT или machine_IP:$HOST_PORT

person nischay goyal    schedule 27.05.2020
comment
Спасибо, пожалуйста, инструкция EXPOSE заменяет -p ? Хотя это так, я добавил его в свой файл докера, надеясь, что он будет делать именно это. - person John Code; 28.05.2020
comment
Спасибо, я сделал именно то, что вы сказали, но теперь я получаю эту ошибку: sh: ./serve.sh: неизвестный операнд. Я обновил свою инструкцию CMD до: CMD [bin/bash ./serve.sh] - person John Code; 28.05.2020
comment
Отредактировал мой ответ и добавил CMD, пожалуйста, посмотрите - person nischay goyal; 28.05.2020

tl;dr

  • docker run -it затем аргументы (c/o Лука Фаббиан)
  • У вас нет bash. Используйте sh. (c/o MC Император)
  • Форме выполнения CMD нужен массив, поэтому используйте запятые: CMD ["sh", "./serve.sh"]
  • CMD имеет форму оболочки, если вы легко забываете синтаксис: CMD ./serve.sh
  • Даже не запускайте оболочку, если в этом нет необходимости: CMD ["./serve.sh"]

Порядок аргументов имеет значение

Это предполагает, что вы уже воспользовались советом Луки:

Имейте в виду, что порядок аргументов docker имеет значение: вы написали docker run b24b37614e1a -it, который отличается от docker run -it b24b37614e1a.

У вас нет bash.

Я вытащил образ openjdk:8-jdk-alpine для подтверждения, и он не поставляется с bash. Образы Alpine поставляются с sh, поэтому предоставленный код никогда не будет работать, если вы не исправите используемую оболочку или не установите bash.

неизвестный операнд

Из вашего ответа на nischay:

Я получаю эту ошибку: sh: ./serve.sh: неизвестный операнд

Я обновил инструкцию My CMD до: CMD [ bin/bash ./serve.sh ]

CMD в форме exec принимает массив инструкций. Они должны быть разделены запятой.

Сделай это:

CMD [ "executable", "param1" ]
                  ^

Примечание об использовании CMD

Как сказал Нишай , есть несколько разных способов использовать CMD, чтобы сделать примерно одно и то же, из цитируемой ссылки.

На самом деле вы можете использовать форму exec CMD, чтобы сказать что-то вроде:

CMD [ "sh", "./serve.sh" ] 

Вводить /bin/sh или /bin/bash или любую другую оболочку, которую вы хотите, не требуется, если это не требуется. Но если вам не нужна оболочка, вы можете использовать форму exec и без оболочки:

CMD [ "./serve.sh" ]
person dcwaters    schedule 18.11.2020