在 Docker 中禁止循环访问
/run/secrets
中的文件;或者也许,sh
?
我正在尝试在
ENTRYPOINT
调用的脚本中执行此操作:
#!/bin/sh
…
cd /run/secrets/users
ls -l # A list of files, proving that the secrets are present, is output.
for username in *; do
echo "username is «$username»" # But $username is empty here.
done
ls -l
和echo
的输出为:
(container name) | total 8
(container name) | -rw-r--r-- 1 root root 9 May 17 17:08 file1
(container name) | -rw-r--r-- 1 root root 5 May 17 17:08 file2
(container name) | username is «»
alpine
。我期望变量
username
将包含/run/secrets/users
中每个文件的名称。
假设你的项目目录如下所示:
├── Dockerfile
├── entrypoint.sh
├── file1
├── file2
└── file3
入口点脚本与问题中的相同:
#!/bin/sh
cd /run/secrets/users
ls -l
for username in *; do
echo "username is «$username»"
done
您没有提供
Dockerfile
,但这可以完成工作:
FROM alpine:latest
COPY file* /run/secrets/users/
COPY entrypoint.sh .
ENTRYPOINT ["sh", "entrypoint.sh"]
运行这样的东西:
docker build -t secrets . && docker run -it secrets
这会将文件复制到图像上。
您可以通过与正在运行的容器共享卷来使其更加灵活。更改项目结构:
├── Dockerfile
├── entrypoint.sh
└── users
├── file1
├── file2
└── file3
现在将
users
文件夹安装为卷。
docker build -t secrets .
docker run -it -v ./users/:/run/secrets/users/ secrets
这是一种更灵活的方法,因为您在添加或更改用户文件时不需要重建映像。