Docker:如何通过存储一些登录凭据来创建映像

Docker:如何通过存储一些登录凭据来创建映像,docker,Docker,我有一个archlinux的基本映像-archlinux/base 现在使用这个图像,我想创建另一个图像,我希望该图像存储一些登录凭据 我有一个名为sampleprogram的程序。它需要登录。所以使用这个程序的第一步是登录 $ sampleprogram login --它要求输入用户名和密码 从下一次开始,我不必登录并从第二步开始 $ sampleprogram connect 将使用以前输入的登录凭据进行连接 因此,我试图创建一个图像与sampleprgram登录保存 Dockerfi

我有一个archlinux的基本映像-archlinux/base

现在使用这个图像,我想创建另一个图像,我希望该图像存储一些登录凭据

我有一个名为
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
中四处搜索以找到您试图隐藏的内容

(另一个答案是在Dockerfile
ENV
语句中输入登录所需的用户名和密码。这些将以纯文本形式出现在
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
中四处搜索以找到您试图隐藏的内容

(另一个答案是在Dockerfile
ENV
语句中输入登录所需的用户名和密码。这些将以纯文本形式出现在
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多级构建可能解决您的问题,请参见下面的答案