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
相关产品推荐
相关产品推荐

