无法在Docker映像中运行可执行文件:未找到错误

时间:2020-05-28 10:51:55

标签: docker dockerfile

我正在尝试构建一个安装了tfswitch的简单docker镜像。我尝试通过运行curl并执行tfswitch 0.12.24以安装terraform v0.12.24在Mac OSX上本地运行。它在那里工作得很好。但是,我需要从中创建一个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。

3 个答案:

答案 0 :(得分:1)

由于Docker容器是一个隔离的环境,因此不需要“切换器”或“版本管理器”类型的工具。 Hashicorp distributes Terraform作为已编译(Go)二进制文件,因此您只需下载并运行它即可;您不需要将其包含在Ruby基本映像中。

an official hashicorp/terraform image,您可以考虑使用它,而不是自己构建。由于它是一个静态链接的二进制文件,因此您也可以在没有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

答案 1 :(得分:1)

在尝试使用docker内部的tfswitch实现相同目标时,我遇到了同样的问题。我们还将从在CI / CD基本映像中使用静态定义的terraform版本切换到允许在部署时动态选择版本。

此问题特定于基于alpine的图像。 tfswitch二进制文件是动态链接到glibc的,它没有与Alpine打包在一起(使用uclibc作为轻量级替代品)。

我最终将此glibc高山软件包添加到了图像: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

希望这对某人有帮助!正在扯我的头发,试图找出正在发生的事情。

答案 2 :(得分:0)

这可能是在恢复旧线程,但我想指出现在可能有更简洁的方法来做到这一点。我通过向 node:alpine 容器添加 libc6-compat 包解决了这个明显的问题。

(它实际上是一个包含 terragrunt、terraform、cdktf 和 tfswitch 的构建容器),但以下是相关信息:

FROM node:alpine
RUN apk add --no-cache git curl docker-cli unzip libc6-compat
# install cdktf
# install terraform
# install terragrunt
# install tfswitch:
curl -L https://raw.githubusercontent.com/warrensbox/terraform-switcher/release/install.sh | sh