silinternational/s3-expand

CLI 工具,用于将 S3 中的文件扩展到 Docker 容器中

1.6 2016-07-26 01:06 UTC

This package is auto-updated.

Last update: 2024-08-28 21:00:35 UTC


README

s3-expand 是一个用于在 Docker 容器中使用的 bash shell 脚本包装器。它提供了生成和编辑文件的功能

  • 将环境变量的内容定向到文件中
  • 从 Amazon S3 拉取数据
    • 单个文件
    • 归档文件,提取到目录中
    • 文件同步
  • 在现有文件上运行 sed

注意:对于本地开发,您可以使用 docker 的 --env-file 开关传入这些环境变量;请参阅 ENV-FILE.example 以了解该文件可能的样子。

用法

s3-expand <actual_cmd> [args ...]
s3-expand -c <filename>

actual_cmd 在包装器完成其运行后由包装器执行。操作由以下环境变量之一或多个设置确定。如果没有设置,脚本将执行 actual_cmd

  • EXPAND_FILES
  • EXPAND_SED_FILES
  • EXPAND_S3_TARS
  • EXPAND_S3_FILES
  • EXPAND_S3_FOLDERS

每个功能的详细信息将在以下章节中介绍。

假设包装器作为 root 在容器中运行,因此具有创建文件和更改所有者和模式的任意能力。因此,如果以其他用户身份运行,可能不会正确执行所有操作。

第二种形式将脚本作为转换实用程序运行,将文件中的所有换行符转换为八进制 032,然后可以将其放入 ENV 变量中以供 EXPAND_FILES 模式使用。

EXPAND_FILES

EXPAND_FILES 的值必须是一个由空格分隔的键值对列表,每个键值对由等号 (=) 分隔。对于每个对,键是引用的环境变量的名称,值是新文件的路径,其内容是引用变量的当前值。如果路径中不存在父目录,则将创建所有父目录,并且如果引用的环境变量未设置,则忽略该特定的键值对。您也可以将 [mode|][mode|owner][|owner] 追加到路径中,以设置数值文件权限和/或文件所有者。由于环境变量中不允许换行符,脚本将替换引用环境变量值中的任何 ASCII SUB 字符 (\032\x1a) 为创建的文件中的换行符。

例如,假设为容器设置了以下内容

EXPAND_FILES= ISSUE=/etc/issue SPECIFIC=/home/foo/.bashrc[0664|foo] FORGOT=/data/my_file

ISSUE=Linux, running in Docker!
SPECIFIC=cd ~

然后,当容器启动时,包装器脚本将使用 "Linux, running in Docker!" 覆盖 /etc/issue,使用内容 "cd ~"(没有换行符)创建 /home/foo/.bashrc,权限为 664,所有者为用户 'foo',对于 /data/my_file 不执行任何操作,因为 FORGOT 未设置。

EXPAND_SED_FILES

EXPAND_SED_FILES 的值必须是一个由空格分隔的键值对列表,每个键值对由管道 (|) 分隔。键是现有文件的路径,值是 sed 脚本的路径。

对于每个键值对,将运行 sed -i "<key>" -f "<value>"

假设为容器设置了以下 ENV 变量

EXPAND_SED_FILES="/etc/issue|/data/issue.sed"

考虑到 /etc/issue 已经存在,内容为

Ubuntu 14.04.2 LTS \n \l

...并且 /data/issue.sed 已经放置在容器中,内容为

1s/$/ \n \t/

包装器将运行 sed/etc/issue 的结果内容将是

Ubuntu 14.04.2 LTS \n \l \n \t

S3 访问

从Amazon S3拉取数据有三种模式:文件、同步和归档。每种模式都需要设置两个环境变量才能工作。它们是

  • EXPAND_S3_KEY
  • EXPAND_S3_SECRET

它们必须分别设置为AWS访问密钥和AWS秘密密钥,这些密钥具有访问指定的S3目标的足够权限。使用后,它们将从环境中清除。

EXPAND_S3_FILES

EXPAND_S3_FILES的值必须是一个以空格分隔的键值对列表,每个键值对由管道符号(|)分隔。键是S3中文件的存储位置,格式为bucket/path-to-file。值是将文件放置的路径,可以是文件名,也可以是目录(如果以/结尾)。如果父目录不存在,将创建它们。你还可以在路径后附加[mode,][mode,owner][,owner]以设置数字文件权限和/或文件所有者。

假设为容器设置了以下ENV变量(除了S3凭证之外)

EXPAND_S3_FILES="DXCmEdg4gb/database.sql|/archive.sql yBO8IJ/homes/foo/authorized_keys|/home/foo/.ssh/"

包装器将以此方式拉取文件

s3://DXCmEdg4gb/database.sql          -> /archive.sql
s3://yBO8IJ/homes/foo/authorized_keys -> /home/foo/.ssh/authorized_keys

EXPAND_S3_TARS

EXPAND_S3_TARS的值必须是一个以空格分隔的键值对列表,每个键值对由管道符号(|)分隔。键是S3中tar存档的存储位置,格式为bucket/path-to-archive。值是存档应该提取到的目录。如果该目录不存在,将创建它。你还可以在展开目录路径后附加[owner]以设置该目录中所有文件的所属权。

假设为容器设置了以下ENV变量(除了S3凭证之外)

EXPAND_S3_TARS="DXCmEdg4gb/data.tar|/data yBO8IJ/homes/foo/special.tar|/home/foo/my_dir/"

给定data.tar的内容

toplevelfile
newdir/
newdir/foo
newdir/bar

给定special.tar的内容

a
b
c

包装器将以此方式提取存档

s3://DXCmEdg4gb/data.tar          -> /data/toplevelfile
                                  -> /data/newdir/foo
                                  -> /data/newdir/bar

s3://yBO8IJ/homes/foo/special.tar -> /home/foo/my_dir/a
                                  -> /home/foo/my_dir/b
                                  -> /home/foo/my_dir/c

EXPAND_S3_FOLDERS

EXPAND_S3_FOLDERS的值必须是一个以空格分隔的键值对列表,每个键值对由管道符号(|)分隔。键是S3中文件夹的存储位置,格式为bucket/path-to-folder。值是目录的路径(如果不存在,将创建它。

如果键以斜杠(/)结尾,则同步S3文件夹中的内容;如果不以斜杠结尾,则同步S3文件夹本身到目标目录。

你还可以在展开目录路径后附加[owner]以设置该目录中所有文件的所属权。

假设为容器设置了以下ENV变量(除了S3凭证之外)

EXPAND_S3_FOLDERS="DXCmEdg4gb/proj|/data yBO8IJ/homes/foo/|/home/foo"

假设S3中的文件夹布局如下

s3://DXCmEdg4gb/proj/Makefile
s3://DXCmEdg4gb/proj/source.c
s3://DXCmEdg4gb/proj/source.h

s3://yBO8IJ/homes/foo/.ssh/
s3://yBO8IJ/homes/foo/.ssh/authorized_keys

包装器将以此方式同步

s3://DXCmEdg4gb/proj/Makefile              -> /data/proj/Makefile
s3://DXCmEdg4gb/proj/source.c              -> /data/proj/source.c
s3://DXCmEdg4gb/proj/source.h              -> /data/proj/source.h

s3://yBO8IJ/homes/foo/.ssh/authorized_keys -> /home/foo/.ssh/authorized_keys

测试

tests中包含了一个简单的shell测试框架,用于验证包装器的操作。它设计为以root身份在容器中运行;包含的Dockerfile用于此目的。

只需创建一个名为env.local的文件,其内容类似于

EXPAND_S3_KEY=OTGJTJBPGPXVHUKOUBTY
EXPAND_S3_SECRET=NUId1Ar6nnQ/ah4Y27q5bskVHxhJHPipvC3kEitb

S3_TEST_PATH=random-bucket-OyQ3Qu/randomfolder-xtyD2C

然后,要运行测试,使用以下命令

docker build -t s3-expand-testing .
docker run --rm -it --env-file env.local s3-expand-testing bash

从URL s3://$S3_TEST_PATH形成的S3文件夹将用作测试包装器从S3拉取模式的前置区域。