docker run не запускается сценарий оболочки (файл не найден), хотя сценарий оболочки был успешно добавлен в docker build - PullRequest
0 голосов
/ 06 марта 2020

Я использую частный docker репозиторий-концентратор https://hub.docker.com/u/privaterepoexample/, после чего я собрал свой docker образ, используя следующие команды:

docker login
docker build -t privaterepoexample/sre:local .
docker tag 85cf9475bc1c privaterepoexample/sre
docker push privaterepoexample/sre

Вывод docker build, который показывает login.sh добавлено в контейнер:

Executing busybox-1.29.3-r10.trigger
OK: 85 MiB in 57 packages
Removing intermediate container 12fd67450dfc
 ---> e9ca0b9e4ac4
Step 5/7 : WORKDIR /opt
---> Running in ce881ede94aa
Removing intermediate container ce881ede94aa
---> 2335b4f522ac
Step 6/7 : ADD login.sh /opt
---> 2aabf1712153
Step 7/7 : CMD ["chmod 755 login.sh  && ./login.sh"]
 ---> Running in 8ec824d4e561
Removing intermediate container 8ec824d4e561
 ---> c97a4ad61578
Successfully built c97a4ad61578
Successfully tagged privaterepoexample/sre:local

Приведенный ниже Dockerfile успешно создан и логин. sh успешно добавлен:

FROM ubuntu:16.04


RUN apt-get update && apt-get install -y \
curl

FROM openjdk:8-jre-alpine

RUN apk --no-cache add curl


WORKDIR /opt


ADD login.sh /opt


CMD ["chmod 755 login.sh  && ./login.sh"]

Теперь у меня возникает проблема, когда я выполнить docker run, как показано ниже, я получаю сообщение об ошибке:

docker run -i privaterepoexample/sre 

 docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"chmod 755 login.sh  && ./login.sh\": stat chmod 755 login.sh  && ./login.sh: 
no such file or directory": unknown.

но почему он говорит, что нет такого файла? учитывая, что я go внутри контейнера docker, я вижу скрипт login.sh с командой ниже:

$ docker run -it   
privaterepoexample/sre /bin/sh
/opt # ls
login.sh
/opt # cat login.sh 
#!/bin/sh
# Black Box Tester!
content=$(curl  --location --request POST  
"https://api.platform.abc.com/auth/oauth/token" --header    
'Content-Type: application/x-www-form-urlencoded' \
 --header 'Authorization: Basic ' --data-raw 'grant_type=password&
username=event@abc.com&password=fJff'| jq -r 
'.domain_id' )
 if [ $content = abc ]
     then
          echo “Valid Login Token”
else
          echo “invalid url”
fi
/opt # exit

1 Ответ

1 голос
/ 07 марта 2020

Вы получаете ошибку no such file or directory, потому что вы используете так называемый CMD в exe c форме неожиданным образом.

Вы можете исправить Dockerfile несколькими способами, например:

  • , либо использовать CMD в форме оболочки :

    CMD chmod 755 login.sh && ./login.sh
    
  • или CMD в exe c форме (что часто является хорошей идеей), но гарантирует, что первый аргумент массива JSON - это программа , а не составная команда. Вы можете сделать это, например, запустив chmod 755 … заранее, во время сборки:

    ADD login.sh /opt
    RUN chmod 755 login.sh
    CMD ["./login.sh"]
    

Для получения дополнительной информации о команде CMD и ее братской команде ENTRYPOINT см. Также этот другой ответ SO: CMD не запускается после ENTRYPOINT в Dockerfile

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...