Docker:如何通过存储一些登录凭据来创建映像
我有一个archlinux的基本映像-archlinux/base 现在使用这个图像,我想创建另一个图像,我希望该图像存储一些登录凭据 我有一个名为Docker:如何通过存储一些登录凭据来创建映像,docker,Docker,我有一个archlinux的基本映像-archlinux/base 现在使用这个图像,我想创建另一个图像,我希望该图像存储一些登录凭据 我有一个名为sampleprogram的程序。它需要登录。所以使用这个程序的第一步是登录 $ sampleprogram login --它要求输入用户名和密码 从下一次开始,我不必登录并从第二步开始 $ sampleprogram connect 将使用以前输入的登录凭据进行连接 因此,我试图创建一个图像与sampleprgram登录保存 Dockerfi
sampleprogram
的程序。它需要登录。所以使用这个程序的第一步是登录
$ sampleprogram login
--它要求输入用户名和密码
从下一次开始,我不必登录并从第二步开始
$ sampleprogram connect
将使用以前输入的登录凭据进行连接
因此,我试图创建一个图像与sampleprgram登录保存
Dockerfile:
FROM archlinux/base
RUN pacman -Syy && pacman -S sampleprogram
RUN samplepgrogram login (ofcourse i will be using a script with expect)
docker build -t archlinux/sampleprogram .
生成映像后(例如:arclinux/sampleprogram)
然后我想用:
docker run -it archlinux/sampleprogram sampleprogram connect
一旦这个容器运行,我将使用--link等从另一个容器连接到此容器以执行一些任务。如果您的应用程序
sampleprogram
将用户名和密码作为命令行参数,您可以这样使用它,方法是修改Dockerfile以设置环境变量并使用它登录,然后创建另一个Dockerfile以使用此容器作为中间容器:
Dockerfile 1:
FROM archlinux/base
RUN pacman -Syy && pacman -S sampleprogram
ENV APP_USER_NAME="user-name"
ENV APP_PASSWORD="password"
RUN sampleprogram login ${APP_USER_NAME} ${APP_PASSWORD}
FROM archlinux/sampleprogram:intermediate-v1
WORKDIR "to your working directory"
COPY "src-path" "dest-folder-path" # copy any important folder/content you like to keep
现在,使用docker build:docker build archlinux/sampleprogram:intermediatev1构建此文件。
Dockerfile 2:
FROM archlinux/base
RUN pacman -Syy && pacman -S sampleprogram
ENV APP_USER_NAME="user-name"
ENV APP_PASSWORD="password"
RUN sampleprogram login ${APP_USER_NAME} ${APP_PASSWORD}
FROM archlinux/sampleprogram:intermediate-v1
WORKDIR "to your working directory"
COPY "src-path" "dest-folder-path" # copy any important folder/content you like to keep
然后在第二个文件上运行docker build:docker build archlinux/sampleprogram:sampleapp-v1
现在,您可以运行:docker run-it archlinux/sampleprogram:sampleapp-v1 sampleprogram connect
,这次无需任何凭据提示:)
注意:您的应用程序行为没有提到如何/在何处存储密码,因此
您需要在此处进行这些更改
,但逻辑是您可以利用中间容器来完成这项工作(也称为多阶段构建)如果您的应用程序sampleprogram
将用户名和密码作为命令行参数,您可以通过修改Dockerfile来设置环境变量并使用它登录,然后创建另一个Dockerfile来将其用作中间容器:
Dockerfile 1:
FROM archlinux/base
RUN pacman -Syy && pacman -S sampleprogram
ENV APP_USER_NAME="user-name"
ENV APP_PASSWORD="password"
RUN sampleprogram login ${APP_USER_NAME} ${APP_PASSWORD}
FROM archlinux/sampleprogram:intermediate-v1
WORKDIR "to your working directory"
COPY "src-path" "dest-folder-path" # copy any important folder/content you like to keep
现在,使用docker build:docker build archlinux/sampleprogram:intermediatev1构建此文件。
Dockerfile 2:
FROM archlinux/base
RUN pacman -Syy && pacman -S sampleprogram
ENV APP_USER_NAME="user-name"
ENV APP_PASSWORD="password"
RUN sampleprogram login ${APP_USER_NAME} ${APP_PASSWORD}
FROM archlinux/sampleprogram:intermediate-v1
WORKDIR "to your working directory"
COPY "src-path" "dest-folder-path" # copy any important folder/content you like to keep
然后在第二个文件上运行docker build:docker build archlinux/sampleprogram:sampleapp-v1
现在,您可以运行:docker run-it archlinux/sampleprogram:sampleapp-v1 sampleprogram connect
,这次无需任何凭据提示:)
注意:您的应用程序行为没有提到如何/在何处存储密码,因此
您需要在此处进行这些更改
,但逻辑是您可以利用中间容器来完成这项工作(也称为多阶段构建)不要尝试在Docker映像中存储任何类型的凭据:拥有您映像的任何人都可以窃取凭据。而是在运行时注入凭据,可以使用卷或绑定挂载目录跨容器运行持久化登录令牌
无法在Docker映像中安全地存储数据。任何人都可以轻松地docker history
获取创建映像的命令列表,或者docker run--entrypoint=/bin/sh
获取根shell。即使在没有外壳的额外最小图像上,任何可以运行任何Docker命令的人都可以在主机上使用root,并且可以在/var/lib/Docker
中四处搜索以找到您试图隐藏的内容
(另一个答案是在DockerfileENV
语句中输入登录所需的用户名和密码。这些将以纯文本形式出现在docker历史记录
输出中,供任何人查看。)
如果您需要像这样在容器运行时保持状态,可以使用Docker卷或主机绑定装载。这可能看起来像:
docker run -v $PWD/sampleprogram:/sampleprogram/credentials \
archlinux/sampleprogram:latest \
sampleprogram login
docker run -p 8080:8080 ... \
-v $PWD/sampleprogram:/sampleprogram/credentials \
archlinux/sampleprogram:latest
(假设Dockerfile以类似于
CMD[“sampleprogram”,“connect”]
的内容结束,以设置默认命令。)不要尝试在Docker映像中存储任何类型的凭据:拥有您映像的任何人都可以窃取凭据。而是在运行时插入凭据,可能使用卷或绑定装载的目录跨容器运行持久化登录令牌
无法在Docker映像中安全地存储数据。任何人都可以轻松地docker history
获取创建映像的命令列表,或者docker run--entrypoint=/bin/sh
获取根shell。即使在没有外壳的额外最小图像上,任何可以运行任何Docker命令的人都可以在主机上使用root,并且可以在/var/lib/Docker
中四处搜索以找到您试图隐藏的内容
(另一个答案是在DockerfileENV
语句中输入登录所需的用户名和密码。这些将以纯文本形式出现在docker历史记录
输出中,供任何人查看。)
如果您需要像这样在容器运行时保持状态,可以使用Docker卷或主机绑定装载。这可能看起来像:
docker run -v $PWD/sampleprogram:/sampleprogram/credentials \
archlinux/sampleprogram:latest \
sampleprogram login
docker run -p 8080:8080 ... \
-v $PWD/sampleprogram:/sampleprogram/credentials \
archlinux/sampleprogram:latest
(假设Docker文件以类似于
CMD[“sampleprogram”,“connect”]
的方式结束,以设置默认命令。)Docker多级构建可能解决您的问题,请参见下面的答案Docker多级构建可能解决您的问题,请参见下面的答案