我正在尝试构建一个安装了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。
答案 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