Mar*_*ier 8 azure docker ejbca azure-container-instances containerd
当我尝试为EJBCA-ce创建 Azure 容器实例时,出现错误并且看不到任何日志。
但我收到以下错误:
Failed to start container my-azure-container-resource-name, Error response: to create containerd task: failed to create container e9e48a_________ffba97: guest RPC failure: failed to find user by uid: 10001: expected exactly 1 user matched '0': unknown
一些背景:
我在 azure 云容器实例上运行容器
我试过
它使用相同的环境变量(数据库配置)在本地运行良好。几周前,它曾经以相同的配置运行。
以下是我从 az cli 附加容器组时得到的一些日志。
(count: 1) (last timestamp: 2020-11-03 16:04:32+00:00) pulling image "primekey/ejbca-ce:6.15.2.3"
(count: 1) (last timestamp: 2020-11-03 16:04:37+00:00) Successfully pulled image "primekey/ejbca-ce:6.15.2.3"
(count: 28) (last timestamp: 2020-11-03 16:27:52+00:00) Error: Failed to start container aci-pulsy-ccm-ejbca-snd, Error response: to create containerd task: failed to create container e9e48a06807fba124dc29633dab10f6229fdc5583a95eb2b79467fe7cdffba97: guest RPC failure: failed to find user by uid: 10001: expected exactly 1 user matched '0': unknown
Run Code Online (Sandbox Code Playgroud)
我怀疑这个问题可能与命令有关USER 0,USER 10001我们在 dockerfile 中发现了几次。
COPY dir:89ead00b20d79e0110fefa4ac30a827722309baa7d7d74bf99910b35c665d200 in /
/bin/sh -c rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CMD ["/bin/bash"]
USER 0
COPY dir:893e424bc63d1872ee580dfed4125a0bef1fa452b8ae89aa267d83063ce36025 in /opt/primekey
COPY dir:756f0fe274b13cf418a2e3222e3f6c2e676b174f747ac059a95711db0097f283 in /licenses
USER 10001
CMD ["/opt/primekey/wildfly-14.0.1.Final/bin/standalone.sh" "-b" "0.0.0.0"
MAINTAINER PrimeKey Solutions AB
ARG releaseTag
ARG releaseEdition
Run Code Online (Sandbox Code Playgroud)
ARM模板
(count: 1) (last timestamp: 2020-11-03 16:04:32+00:00) pulling image "primekey/ejbca-ce:6.15.2.3"
(count: 1) (last timestamp: 2020-11-03 16:04:37+00:00) Successfully pulled image "primekey/ejbca-ce:6.15.2.3"
(count: 28) (last timestamp: 2020-11-03 16:27:52+00:00) Error: Failed to start container aci-pulsy-ccm-ejbca-snd, Error response: to create containerd task: failed to create container e9e48a06807fba124dc29633dab10f6229fdc5583a95eb2b79467fe7cdffba97: guest RPC failure: failed to find user by uid: 10001: expected exactly 1 user matched '0': unknown
Run Code Online (Sandbox Code Playgroud)
它在我的本地机器上的 linux (ubuntu 20.04) 上运行良好
COPY dir:89ead00b20d79e0110fefa4ac30a827722309baa7d7d74bf99910b35c665d200 in /
/bin/sh -c rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CMD ["/bin/bash"]
USER 0
COPY dir:893e424bc63d1872ee580dfed4125a0bef1fa452b8ae89aa267d83063ce36025 in /opt/primekey
COPY dir:756f0fe274b13cf418a2e3222e3f6c2e676b174f747ac059a95711db0097f283 in /licenses
USER 10001
CMD ["/opt/primekey/wildfly-14.0.1.Final/bin/standalone.sh" "-b" "0.0.0.0"
MAINTAINER PrimeKey Solutions AB
ARG releaseTag
ARG releaseEdition
Run Code Online (Sandbox Code Playgroud)
在 EJBCA-ce 容器镜像中,我认为他们试图提供一个不同于root运行 EJBCA 服务器的用户。根据Docker 文档:
USER 指令设置用户名(或 UID)和可选的用户组(或 GID)以在运行映像时使用,以及在 Dockerfile 中跟随它的任何 RUN、CMD 和 ENTRYPOINT 指令
在Dockerfile他们引用两个用户,root,对应于 UID 0,另一个用户,与 UID 10001。
通常,在 Linux 和 UNIX 系统中,UID 可以按不同的范围组织:它很大程度上取决于具体的操作系统和用户管理实践,但很有可能在 linux 系统中创建的第一个用户帐户将分配给 UID1001或者10001,就像在这种情况下。请参阅例如维基百科或这篇文章中的UID 条目。
AFAIK,USER指示不需要存在于您的容器中以正确运行它:事实上,如果您在本地运行它,它将毫无问题地启动。
与UID的用户10001将真正建立在由脚本的容器,它在运行CMD中所定义的Dockerfile,/opt/primekey/bin/start.sh通过这个代码片段:
if ! whoami &> /dev/null; then
if [ -w /etc/passwd ]; then
echo "${APPLICATION_NAME}:x:$(id -u):0:${APPLICATION_NAME} user:/opt:/sbin/nologin" >> /etc/passwd
fi
fi
Run Code Online (Sandbox Code Playgroud)
请注意,APPLICATION_NAME在此上下文中,该值采用该值 ejbca,并且运行此脚本的用户(如 中所示Dockerfile)是10001. 这将是id -u此代码中命令提供的值。
如果您在本地运行容器,则可以验证它:
docker run -it -p 8080:8080 -p 8443:8443 -h localhost primekey/ejbca-ce:6.15.2.3
Run Code Online (Sandbox Code Playgroud)
并启动bash它:
docker exec -it container_name /bin/bash
Run Code Online (Sandbox Code Playgroud)
如果你跑whoami,它会告诉你的ejbca。
如果你运行id它会给你以下输出:
uid=10001(ejbca) gid=0(root) groups=0(root)
Run Code Online (Sandbox Code Playgroud)
您也可以验证用户是否存在/etc/passwd:
bash-4.2$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ejbca:x:10001:0:ejbca user:/opt:/sbin/nologin
Run Code Online (Sandbox Code Playgroud)
Pierre 没有得到这个输出的原因是因为他运行容器覆盖了提供的CMD,因此没有执行start.sh负责用户创建的脚本,如上所述。
出于任何原因,这就是我的知识失败的地方,当 Azure 尝试运行您的容器时,它失败了,因为 中USER 10001标识的Dockerfile不存在。
我认为这可能与使用containerd而不是有关docker。
Azure 报告的错误似乎与 Microsoft 项目opengcs 有关。
他们说这个项目:
Open Guest Compute Service 是一个 Linux 开源项目,旨在进一步开发 Linux Hyper-V 容器在 Windows (LCOW) 上的生产质量实现。它旨在在自定义 Linux 操作系统中运行,以支持 Linux 容器负载。
和:
LCOW v2 作为 LCOW v1 的替代品的重点是通过已进入 containerd/containerd 及其 Runtime V2 接口的协调和工作。要查看我们的 containerd 主机端垫片,请查看此处 Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1。
您在控制台中看到的错误是由您可以在其代码库中找到的文件引发的spec.go,当他们尝试建立代表应运行容器进程的用户时:
func setUserID(spec *oci.Spec, uid int) error {
u, err := getUser(spec, func(u user.User) bool {
return u.Uid == uid
})
if err != nil {
return errors.Wrapf(err, "failed to find user by uid: %d", uid)
}
spec.Process.User.UID, spec.Process.User.GID = uint32(u.Uid), uint32(u.Gid)
return nil
}
Run Code Online (Sandbox Code Playgroud)
此代码由其他代码片段执行 - 您可以在此处查看完整的功能代码:
parts := strings.Split(userstr, ":")
switch len(parts) {
case 1:
v, err := strconv.Atoi(parts[0])
if err != nil {
// evaluate username to uid/gid
return setUsername(spec, userstr)
}
return setUserID(spec, int(v))
Run Code Online (Sandbox Code Playgroud)
和getUser功能:
func getUser(spec *oci.Spec, filter func(user.User) bool) (user.User, error) {
users, err := user.ParsePasswdFileFilter(filepath.Join(spec.Root.Path, "/etc/passwd"), filter)
if err != nil {
return user.User{}, err
}
if len(users) != 1 {
return user.User{}, errors.Errorf("expected exactly 1 user matched '%d'", len(users))
}
return users[0], nil
}
Run Code Online (Sandbox Code Playgroud)
如您所见,这些正是 Azure 报告给您的错误。
总之,我认为他们提供了一个符合OCI 图像格式规范的 Windows LCOW 解决方案,适用于运行带有containerd.
正如您所指出的,它是否曾经在几周前以相同的配置运行,我最好的客人是,也许,他们将您的容器从纯 Linuxcontainerd运行时实现切换到基于 Windows 和上述软件的容器,这就是为什么你的容器现在失败了。
一种可能的解决方法是基于 PrimeKey 提供的官方创建自定义图像并创建 user 10001,正如 Pierre 指出的那样。
要完成此任务,首先,创建一个新的自定义Dockerfile. 例如,您可以尝试:
FROM primekey/ejbca-ce:6.15.2.3
USER 0
RUN echo "ejbca:x:10001:0:ejbca user:/opt:/sbin/nologin" >> /etc/passwd
USER 10001
Run Code Online (Sandbox Code Playgroud)
请注意,您可能需要从官方 EJBCA 映像中定义一些环境变量。
有了这个,Dockerfile您可以docker使用适当的docker-compose.yaml文件构建图像或使用 docker compose ,例如:
FROM primekey/ejbca-ce:6.15.2.3
USER 0
RUN echo "ejbca:x:10001:0:ejbca user:/opt:/sbin/nologin" >> /etc/passwd
USER 10001
Run Code Online (Sandbox Code Playgroud)
请按照您认为合适的方式对其进行自定义。
通过这种设置,新容器仍将在本地环境中以与原始容器相同的方式正常运行:我希望在 Azure 中也是如此。
| 归档时间: |
|
| 查看次数: |
806 次 |
| 最近记录: |