Docker-entrypoint.sh приводит к «не найдено» для изображения ARM с golang - PullRequest
0 голосов
/ 07 марта 2019

Моя проблема в том, что я получаю сообщение об ошибке при запуске моего контейнера в системе ARM Arch (RaspberryPI с Raspbian). Изображение было построено на той же малине.

Это мой dockerfile:

FROM arm32v7/golang

COPY qemu-arm-static /usr/bin

ENV STATUSOK_VERSION 0.1.1

RUN apt-get update \
    && apt-get install -y unzip \
    && wget https://github.com/sanathp/statusok/releases/download/$STATUSOK_VERSION/statusok_linux.zip \
    && unzip statusok_linux.zip \
    && mv ./statusok_linux/statusok /go/bin/StatusOk \
    && rm -rf ./statusok_linux* \
    && apt-get remove -y unzip git \
    && apt-get autoremove -y \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

VOLUME /config
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT /docker-entrypoint.sh

Я могу успешно построить это на RaspberryPI под управлением Raspbian:

root@raspberrypi:~/armstatusok# docker build . -t armstatusok
Sending build context to Docker daemon  6.656kB
Step 1/7 : FROM arm32v7/golang
 ---> 8bbfdfd01a06
Step 2/7 : COPY qemu-arm-static /usr/bin
 ---> Using cache
 ---> 2572fd1e03a0
Step 3/7 : ENV STATUSOK_VERSION 0.1.1
 ---> Using cache
 ---> 25d39a4c6eb5
Step 4/7 : RUN apt-get update     && apt-get install -y unzip     && wget https://github.com/sanathp/statusok/releases/download/$STATUSOK_VERSION/statusok_linux.zip     && unzip statusok_linux.zip     && mv ./statusok_linux/statusok /go/bin/StatusOk     && rm -rf ./statusok_linux*     && apt-get remove -y unzip git     && apt-get autoremove -y     && apt-get clean     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 ---> Using cache
 ---> bfb1cfa9a985
Step 5/7 : VOLUME /config
 ---> Using cache
 ---> 3bfbce28329b
Step 6/7 : COPY ./docker-entrypoint.sh /docker-entrypoint.sh
 ---> Using cache
 ---> a1795ca4f40c
Step 7/7 : ENTRYPOINT /docker-entrypoint.sh
 ---> Using cache
 ---> d0ce74911ba3
Successfully built d0ce74911ba3
Successfully tagged armstatusok:latest

Следующий шаг - запустить его, и я попадаю в беду:

root@raspberrypi:~/armstatusok# docker run --name=armstatusok -v $PWD:/config armstatusok
/docker-entrypoint.sh: 1: /docker-entrypoint.sh: /go/bin/StatusOk: not found

Я вошел в одну из строк комментария к контейнеру docker-entrypoint.sh и проверил, действительно ли там был /go/bin/StatusOk, и это было так.

Мой docker-entrypoint.sh:

root@raspberrypi:~/armstatusok# cat docker-entrypoint.sh
/go/bin/StatusOk --config /config/config.json

Теперь мой вопрос: кто-нибудь знает, с чего начать? Я также тестировал этот dockerfile на x86 arch, и там он работал. Я только изменил строку FROM на версию x86 и удалил COPY qemu-arm-static /usr/bin, так как эта строка предназначена для того, чтобы она работала на ARM arch, согласно документации.

1 Ответ

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

Я скопировал этот Dockerfile и дословно запустил скрипт, и он прекрасно работает для меня. Я получаю

Config file not present at the given location: /config/config.json give correct file location using --config parameter

потому что у меня нет доступа к файлу конфигурации, который вы используете. Но тот факт, что я получаю это сообщение, означает, что StatusOk работает. Поэтому я не знаю, что предложить.

Единственное отличие, которое я сделал, - это добавление shebang #!/bin/sh в начало файла docker-entrypoint.sh и обеспечение его разрешения на выполнение, запустив ls -al, а если он не имеет x в разрешения, запущенные chmod +rwx. Не знаю, имело ли это какое-либо значение в том, как скрипт пытался получить доступ к /go/bin/StatusOk.

enter image description here

Полный docker-entrypoint.sh Содержание:

#!/bin/sh
/go/bin/StatusOk --config /config/config.json
...