如何使用 Testcontainers 将可执行文件复制到 Docker 容器

rie*_*pil 8 java docker junit5 testcontainers localstack

我正在尝试使用 JUnit 5 模块将可执行初始化 bash 脚本复制init.sh到使用 Testcontainers (1.13.0) 创建的 Localstack Docker 容器中:

@Container
static LocalStackContainer localStack = new LocalStackContainer("0.10.0")
  .withServices(S3)
  .withCopyFileToContainer(MountableFile.forClasspathResource("init.sh"), "/docker-entrypoint-initaws.d/init.sh");
Run Code Online (Sandbox Code Playgroud)

但在创建的 Docker 容器内,该文件缺少执行权限(使用以下命令查看文件权限进行检查)docker exec -it ID /bin/sh)。

在我的机器上,该文件具有以下权限:

$ ls -al
total 16
drwxr-xr-x  4 xyz  staff  128 Apr 16 20:51 .
drwxr-xr-x  4 xyz  staff  128 Apr 16 08:43 ..
-rw-r--r--  1 xyz  staff  135 Apr 16 20:14 application.yml
-rwxr-xr-x  1 xyz  staff  121 Apr 16 20:51 init.sh
Run Code Online (Sandbox Code Playgroud)

我也尝试使用复制此文件,.withClasspathResourceMapping()但这需要一种仅提供READ_ONLY或的绑定模式READ_WRITE

yup*_*flu 10

您可以使用类的另一个构建器MountableFile,它采用mode带有 posix 文件模式值的参数来更改权限。例如,使脚本仅对所有者可执行:

...
.withCopyFileToContainer(MountableFile.forClasspathResource("init.sh", 0744), "/docker-entrypoint-initaws.d/init.sh");
Run Code Online (Sandbox Code Playgroud)

0744是一个八进制文件模式文字,对应于-rwxr--r--权限。

但是,我尝试使用 Localstack 进行相同的配置0.10.8,并且初始化工作甚至没有使脚本可执行。