FROM ruby:2.2.0
# Install package
RUN apt-get update -qq && apt-get install -y \
build-essential \
libpq-dev \
nodejs \
openssh-server
# Setting sshd
RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
和 docker-compose.yml
version: '2'
services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
- "22"
depends_on:
- db
(对于ssh -> 在流中使用此链接https://docs.docker.com/engine/examples/running_ssh_service/)
然后我连接ssh到容器。 以下是我的步骤:
获取ssh的端口:
docker port demorailsdocker_web_1
# 这是结果
22/tcp -> 0.0.0.0:32768
3000/tcp -> 0.0.0.0:3000
连接ssh到容器
ssh root@localhost -p 32768
# 结果 ssh_exchange_identification: Connection closed by remote host
我发现问题与Dockerfile中的设置有关。
因为当我删除Dockerfile中的这些行时:
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
并且从docker-compose.yml文件中删除那些行。
volumes:
- .:/myapp
然后我可以连接到SSH。
我认为问题在于设置工作目录。
我可以成功连接到容器的SSH,只需在docker-compose.yml文件中删除这一行即可。
command: bundle exec rails s -p 3000 -b '0.0.0.0'
所以我认为问题与Rails有关。 但我不知道如何修复它。
WORKDIR
是正确的,不是问题的一部分。 - DevOps Dan