silinternational / s3-expand
CLI 工具,用于将 S3 中的文件扩展到 Docker 容器中
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拉取模式的前置区域。