Docker run переопределяет entrypoint скриптом оболочки, который принимает аргументы

у меня есть сценарий оболочки entrypoint, который принимает аргументы - a-b.

у меня работает docker-compose.в формате YML файл, где я переопределяю точку входа tomcat с инструкцией:

entrypoint: /usr/local/tomcat/entrypoint.sh -a param1 -b param2

что это docker run альтернатива?

docker run --entrypoint "/usr/local/tomcat/entrypoint.sh -a param1 -b param2" tomcat:jre8

не работает

Я:

docker: Error response from daemon: 
invalid header field value "oci runtime error: container_linux.go:247: 
starting container process caused "exec:
\"/usr/local/tomcat/entrypoint.sh -a param1 -b param2\": 
stat /usr/local/tomcat/entrypoint.sh -a param1 -b param2: 
no such file or directory"n".

FYI:

docker run --entrypoint "/usr/local/tomcat/entrypoint.sh" tomcat:jre8

работает с точки зрения Докера, но, очевидно, сценарий терпит неудачу

3 ответов


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

при выполнении docker run --entrypoint "/usr/local/tomcat/entrypoint.sh -a param1 -b param2" tomcat:jre8 Docker рассматривает все, что находится в этих кавычках, как один файл сценария.

как вы можете видеть из ошибки:

stat /usr/local/tomcat/entrypoint.sh -a param1 -b param2: 
no such file or directory\"\n".

Он пытается выполнить stat в файле перед его запуском, поэтому он знает, существует ли он.

поместите аргументы в точку входа в конце команды docker следующим образом:

docker run --entrypoint <entrypoint.sh> <image:tag> <arg1> <arg2> <arg3>

ваша команда становится:

docker run --entrypoint /usr/local/tomcat/entrypoint.sh tomcat:jre8 -a param1 -b param2 

взгляните на фрагменты кода в официальной документации:

точка входа изображения похожа на команду, потому что она указывает что исполняемый файл для запуска при запуске контейнера

https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime


Я думаю, что это также стоит отметить:

если у вас есть куча аргументов в свой ваш --entrypoint должен быть первым.

Я не знаю, какой из моих аргументов был проблемой, но положить --entrypoint "/bin/bash" в конце не предотвратил выполнение ENTRYPOINT из файла Dockerfile. Мои аргументы включали:

  • 1x --rm
  • 1x --name
  • 1x-it
  • 3x-v
  • 6x - п
  • 4x-e

Я не уверен, что вы можете сделать это в соответствии с официальной документацией докера:

Примечание: Вы можете переопределить параметр ENTRYPOINT с помощью --entrypoint, но это может только установить двоичный файл в exec (не будет использоваться sh-c).

https://docs.docker.com/engine/reference/builder/#/environment-replacement