我有一个容器,它在启动时创建一个用户,使用正确的UID/GID(这个docker可用于开发团队,他们可能不共享相同的ID)。为了让他们编译/访问源文件,有必要在容器中有一个与主机用户具有相同ID的用户。
创建用户的入口点部分如下所示:
if ! id -u "${USER_ID}"; then
adduser \
--disabled-password \
--gecos "Docker Builder" \
--gid "${USER_GID}" \
--uid "${USER_ID}" \
--shell /bin/bash \
--home "${USER_HOME}" \
"${USER_NAME}"
fi
其中变量由docker exec -e
给出
到目前为止,我只将VScode附加到运行的容器上,并且为这个容器ID指定remoteUser
就足够了,但是使用这种附加到容器上的方式,我无法在一个容器上打开多个VScode窗口,为了实现这一点,我必须使用devcontainer.json
。
我查看了文档,但找不到一种方法来告诉devcontainer.json
连接到容器中尚未定义的用户。
或者换句话说,我可以在运行时更改用户吗?
这就是我目前所做的。
tasks.json
"inputs": [
{
"id": "get_uid",
"type": "command",
"command": "shellCommand.execute",
"args": {
"command": "id -u",
"useFirstResult": true
}
},
{
"id": "get_gid",
"type": "command",
"command": "shellCommand.execute",
"args": {
"command": "id -g",
"useFirstResult": true
}
}
]
devcontainer.json
"image": "myDocker",
"forwardPorts": [3000],
// Emulate : docker exec -e
"containerEnv": {
"LOCAL_USER_NAME" : "vscode",
"LOCAL_USER_HOME" : "/home/vscode",
"LOCAL_USER_ID" : "${input:get_uid}",
"LOCAL_USER_GID" : "${input:get_gid}"
},
"overrideCommand": false
我不想更改/覆盖Dockerfile,因为这会破坏独立于UID/GID创建单个容器的机制。
也许我错过了什么,或者我看错了方向?
1条答案
按热度按时间kulphzqa1#
多亏了@DavidMaze给我指明了正确的方向,我终于让它发挥了作用。
我改变了我的
entrypoint
和我的Dockerfile
。现在,我在
Dockerfile
中创建了一个通用用户,并在入口点更改了它的uid/gid(如果需要)。这允许我从
devcontainer.json
使用runArgs
,并让VScode处理它自己的entrypoint
。我在这里不再使用
tasks.json
,但是我现在知道如何进行一些动态替换。谢啦,谢啦