docker 容器无法使用 `service sshd restart`
docker container can't use `service sshd restart`
我正在尝试构建一个 hadoop Dockerfile
。
在构建过程中,我添加了:
&& apt install -y openssh-client \
&& apt install -y openssh-server \
&& ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa \
&& cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys \
&& chmod 0600 ~/.ssh/authorized_keys
&& sed -i '/\#AuthorizedKeysFile/ d' /etc/ssh/sshd_config \
&& echo "AuthorizedKeysFile ~/.ssh/authorized_keys" >> /etc/ssh/sshd_config \
&& /etc/init.d/ssh restart
我假设当我 运行 这个容器时:
docker run -it --rm hadoop/tag bash
我将能够:
ssh localhost
但是我得到一个错误:
ssh: connect to host localhost port 22: Connection refused
如果我 运行 在容器内手动执行此操作:
/etc/init.d/ssh restart
# or this
service ssh restart
然后我就可以连接了。我认为这意味着 sshd 重新启动没有工作。
我在 Dockerfile
中使用 FROM java
。
构建过程只构建一个图像。当时 运行 的进程(使用 RUN
)在构建后不再 运行ning,并且在使用图像启动容器时不会再次启动。
您需要做的是让 sshd 在容器运行时间启动。最简单的方法是使用入口点脚本。
Dockerfile:
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["whatever", "your", "command", "is"]
entrypoint.sh:
#!/bin/sh
# Start the ssh server
/etc/init.d/ssh restart
# Execute the CMD
exec "$@"
使用上面的方法重建镜像,当你用它来启动容器时,它应该在 运行 启动你的 CMD
.
之前启动 sshd
如果您愿意,您也可以将开始使用的基本图像更改为 Phusion baseimage 之类的图像。它可以轻松启动一些服务,如 syslogd、sshd,您可能希望容器具有 运行ning.
我正在尝试构建一个 hadoop Dockerfile
。
在构建过程中,我添加了:
&& apt install -y openssh-client \
&& apt install -y openssh-server \
&& ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa \
&& cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys \
&& chmod 0600 ~/.ssh/authorized_keys
&& sed -i '/\#AuthorizedKeysFile/ d' /etc/ssh/sshd_config \
&& echo "AuthorizedKeysFile ~/.ssh/authorized_keys" >> /etc/ssh/sshd_config \
&& /etc/init.d/ssh restart
我假设当我 运行 这个容器时:
docker run -it --rm hadoop/tag bash
我将能够:
ssh localhost
但是我得到一个错误:
ssh: connect to host localhost port 22: Connection refused
如果我 运行 在容器内手动执行此操作:
/etc/init.d/ssh restart
# or this
service ssh restart
然后我就可以连接了。我认为这意味着 sshd 重新启动没有工作。
我在 Dockerfile
中使用 FROM java
。
构建过程只构建一个图像。当时 运行 的进程(使用 RUN
)在构建后不再 运行ning,并且在使用图像启动容器时不会再次启动。
您需要做的是让 sshd 在容器运行时间启动。最简单的方法是使用入口点脚本。
Dockerfile:
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["whatever", "your", "command", "is"]
entrypoint.sh:
#!/bin/sh
# Start the ssh server
/etc/init.d/ssh restart
# Execute the CMD
exec "$@"
使用上面的方法重建镜像,当你用它来启动容器时,它应该在 运行 启动你的 CMD
.
如果您愿意,您也可以将开始使用的基本图像更改为 Phusion baseimage 之类的图像。它可以轻松启动一些服务,如 syslogd、sshd,您可能希望容器具有 运行ning.