You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dockerfile设置AUTHORIZED_KEYS为容器SSH公钥后变量为空问题咨询

问题根因
  • Dockerfile中RUN指令内定义的shell变量是临时变量,仅在当前RUN对应的shell进程中有效,指令执行完成后变量就会销毁,无法传递给后续的ENV指令。
  • 你开头定义的ARG SSH_PUBLIC_KEY属于构建时参数,默认没有传入值的情况下为空,后续ENV AUTHORIZED_KEYS=$SSH_PUBLIC_KEY读取的是空的构建参数值,自然没有内容。
解决方案

我们可以通过启动入口脚本(ENTRYPOINT)的方式实现变量赋值:在容器启动时先读取本地生成的公钥文件内容,赋值给AUTHORIZED_KEYS环境变量后再启动ssh服务,这种方式兼容性最好,所有运行场景都能读到该变量。

修改后的Dockerfile如下:

FROM alpine:latest

# 安装依赖、配置ssh、生成密钥对
RUN    apk update \
    && apk add --no-cache openssh openssh-server-pam \
    && mkdir /root/.ssh \
    && chmod 0700 /root/.ssh \
    && ssh-keygen -A \
    && sed -i s/^#PasswordAuthentication\ yes/PasswordAuthentication\ no/ /etc/ssh/sshd_config \
    && sed -i s/^#UsePAM\ no/UsePAM\ yes/ /etc/ssh/sshd_config \
    && sed -i s/root:!/"root:*"/g /etc/shadow \
    && ssh-keygen -f ~/.ssh/id_rsa -N "" -q

# 编写启动入口脚本,先赋值环境变量再启动sshd
RUN echo -e '#!/bin/sh\n\
export AUTHORIZED_KEYS=$(cat /root/.ssh/id_rsa.pub)\n\
# 如果需要实现容器自身免密登录,可以解开下面一行注释\n\
# echo "$AUTHORIZED_KEYS" > /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys\n\
exec /usr/sbin/sshd -D' > /entrypoint.sh \
    && chmod +x /entrypoint.sh

EXPOSE 22

ENV ERNIE="hellooo there ernie"

ENTRYPOINT ["/entrypoint.sh"]
验证方法

镜像构建完成后启动容器,执行以下命令即可看到变量已成功赋值:
docker exec <你的容器名或ID> env | grep AUTHORIZED_KEYS

内容的提问来源于stack exchange,提问作者ErnieAndBert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:54:07