Не удалось запустить исполняемый файл внутри образа Docker: ошибка не найдена - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать простой образ docker с установленным tfswitch . Я попробовал запустить его локально на Ma c OSX, запустив curl и выполнив tfswitch 0.12.24, чтобы установить terraform v0.12.24. Там он отлично работает. Однако мне нужно создать из него изображение Docker, и он продолжает терпеть неудачу. Кажется, что tfswitch добавлен к изображению, но RUN /usr/local/bin/tfswitch 0.12.24 выдает ошибку No such file or directory. Я просмотрел различные сообщения в Интернете, в которых рекомендовалось изменить разрешения и добавить usr/local/bin в Path. Я все это пробовал. В PATH также по умолчанию добавлено usr/local/bin. Не уверен, что не так. Ниже приведено изображение docker, которое также изменит разрешения, отобразит путь, а также запустит which tfswitch, чтобы определить местоположение tfswitch. Мне кажется, все в порядке. Не уверен, что случилось. Есть идеи, что может быть не так?

FROM ruby:2.4.1-alpine AS Dummy_Image
RUN apk add --update --no-cache curl
RUN sh -c "$(curl -L https://raw.githubusercontent.com/warrensbox/terraform-switcher/release/install.sh)" 
RUN echo "${PATH}"
RUN which tfswitch
RUN chmod 777 /usr/local/bin
RUN ls -l /usr/local/bin
RUN /usr/local/bin/tfswitch 0.12.24

Я пробовал с RUN "/usr/local/bin/tfswitch 0.12.24", RUN "tfswitch 0.12.24", а также RUN tfswitch 0.12.24, но все равно не работает. Пробовал использовать chmod только для исполняемого файла.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Поскольку контейнер Docker является изолированной средой, вам не нужны инструменты типа «переключатель» или «менеджер версий». Hashicorp распространяет Terraform как скомпилированный (Go) двоичный файл, так что вы можете просто загрузить его и запустить; вам не нужно, чтобы он был в Ruby базовом образе.

Существует официальный hashicorp/terraform образ , и вы можете просто использовать его вместо создания своего собственного. Поскольку это один статически связанный двоичный файл, вы также можете просто загрузить и запустить его без Docker (и учитывая предоставленную пользователем конфигурацию и файлы локального состояния, а также некоторые случаи неявно предоставленных учетных данных из $HOME, это может быть намного проще).

Если вы действительно хотите создать свой собственный, вы можете просто загрузить двоичный файл:

ARG terraform_version=0.12.26
RUN cd /tmp \
 && curl -LO https://releases.hashicorp.com/terraform/${terraform_version}/terraform_${terraform_version}_linux_amd64.zip \
 && unzip terraform_${terraform_version}_linux_amd64.zip \
 && mv terraform /usr/local/bin \
 && rm terraform_${terraform_version}_linux_amd64.zip
0 голосов
/ 13 августа 2020

Я столкнулся с той же проблемой, пытаясь добиться того же с tfswitch внутри docker. Мы также делаем переход от использования статически определенной версии terraform в нашем базовом образе CI / CD к разрешению динамического выбора c версии во время развертывания.

Эта проблема специфична с c на alpine изображения на основе. Двоичный файл tfswitch динамически связан с glibc, который не поставляется с alpine (использует uclibc в качестве облегченной альтернативы).

В итоге я добавил этот пакет glibc alpine к изображению: https://github.com/sgerrand/alpine-pkg-glibc/

В частности, я добавил это в свой Dockerfile перед установкой tfswitch:

# Install glibc (dependency for tfswitch)
RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
  && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.32-r0/glibc-2.32-r0.apk \
  && apk add glibc-2.32-r0.apk

Надеюсь, это кому-то поможет! Рвал себе волосы, пытаясь понять, что происходит.

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