我编写了我的第一个Dockerfile,以便使用tor和polipo测试Docker。 我的Dockerfile看起来像:
# Pull base image.
FROM ubuntu:latest
# Upgrade system
RUN apt-get update && apt-get dist-upgrade -y --no-install-recommends && apt-get autoremove -y && apt-get clean
# Install TOR
RUN apt-get install -y --no-install-recommends tor tor-geoipdb torsocks && apt-get autoremove -y && apt-get clean
# INSTALL POLIPO
RUN apt-get update && apt-get install -y polipo
# Default ORPort
EXPOSE 9001
# Default DirPort
EXPOSE 9030
# Default SOCKS5 proxy port
EXPOSE 9050
# Default ControlPort
EXPOSE 9051
# Default polipo Port
EXPOSE 8123
RUN echo 'socksParentProxy = "localhost:9050"' >> /etc/polipo/config
RUN echo 'socksProxyType = socks5' >> /etc/polipo/config
RUN echo 'diskCacheRoot = ""' >> /etc/polipo/config
RUN echo 'ORPort 9001' >> /etc/tor/torrc
RUN echo 'ExitPolicy reject *:*' >> /etc/tor/torrc
RUN mkdir scrapy
ADD scrapyTor scrapy
ADD startpolipotor.sh .
RUN chmod 775 ./startpolipotor.sh
我的startpolipotor.sh包含3行:
#!/bin/bash
/etc/init.d/tor start &
/etct/init.d/polipo start &
但是当我启动这个命令时:
docker run -i -t id_image /bin/bash
当我启动ps
时,一旦进入容器内部,我什么也看不见。
我怎么解决这个问题?
答案 0 :(得分:2)
您的Dockerfile
应该有一个定义如下的命令:
CMD ./startpolipotor.sh
然后您不需要提供/bin/bash
作为run
命令。只有以下内容应该足够了:
docker run -i -t id_image
顺便说一句:您的脚本文件会创建两个在后台运行的进程。那不行!
Docker容器需要始终处于前台进程。在您的情况下,容器将在执行启动脚本后立即停止。虽然停止SIGTERM
将无法正确地发送到这些后台进程,因此它们只会被杀死并可能留下一些损坏的数据。
当您需要在容器中启动多个进程时,您应该考虑使用supervisord
。