Docker 容器中的 SSH 导致 HTTP 404

SSH in Docker container causes HTTP 404

我有这么简单的 dockerfile PHP:

# Base image
FROM php:7-fpm

# Update packages list
RUN apt-get --yes update;

# Install SSH server, set root password and allow root login
RUN apt-get  --yes install openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:123' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# Run SSH server
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

这样的docker-compose.yml文件

web:
  image: nginx:latest
  volumes:
    - /c/Users/marcin/dock-test/composers/l1.app/html/:/usr/share/nginx/html/
    - /c/Users/marcin/dock-test/composers/l1.app/nginx/conf.d/:/etc/nginx/conf.d/
    - /c/Users/marcin/dock-test/composers/l1.app/nginx/log/:/var/log/nginx/
  ports:
    - "8080:80"
  working_dir: /usr/share/nginx/html/
  links:
    - php
    - db
  container_name: l1.web
  environment:
    - VIRTUAL_HOST=l1.app  
php:
  build: ../builds
  dockerfile: Dockerfile-php7-fpm
  volumes:
    - /c/Users/marcin/dock-test/composers/l1.app/html/:/usr/share/nginx/html/
    - /c/Users/marcin/dock-test/composers/l1.app/php/config/:/usr/local/etc/php/
  working_dir: /usr/share/nginx/html/
  links:
    - db
  container_name: l1.php 
  ports:
    - "22020:22"   
db:
  image: mysql:5.7
  environment:
     - MYSQL_ROOT_PASSWORD=pass
     - MYSQL_DATABASE=
     - MYSQL_USER=
     - MYSQL_PASSWORD=
  expose:
     - 3306
  volumes:
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/data/:/var/lib/mysql/
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/conf.d/:/etc/mysql/conf.d/
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/log/:/var/log/mysql/
  ports:
    - "33060:3306"
  container_name: l1.db

问题 - 一切正常,直到我在我的 dockerfile 中添加最后显示的行:

CMD ["/usr/sbin/sshd", "-D"]

如果我添加此行,SSH 工作正常但我在显示页面时收到 404。当我评论这一行时,我得到的页面没有问题,但显然这个 SSH 不工作。

这可能是什么问题?我只想在 PHP 容器中添加我需要此 SSH 服务(并且 运行 docker exec 在这种情况下不是一个选项)

base image php-fpm

结尾
CMD ["php-fpm"]

您自己的 CMD 会覆盖它(意思是 php .

一种解决方法是至少添加并调用包装脚本,该脚本将:

  • 致电php-fpm
  • 启动 sshd 守护程序

但这不能很好地处理 stop/kill 信号,这不会阻止一切。 用于管理多个主进程。

OP Marcin Nabiałek confirms :

I've created such file:

#!/bin/sh 
# Start PHP 
php-fpm -D 
# Start SSH 
/usr/sbin/sshd -D 

and it seems to be working now without a problem.

@VonC 和@Marcin Nabialek 的完整回答。

# php-fpm -D 
# /usr/sbin/sshd -D 

# use \n to make the content into multiple lines
RUN printf "php-fpm -D\n/usr/sbin/sshd -D" >> /start.sh

RUN chmod +x /start.sh

CMD ["/start.sh"]