在实现了Docker容器启动时启动ssh服务,基本实现了一个可以随时构建的干净的容器环境。
以此类推,我们很容易就在上述Docker容器环境中安装各种软件包,构建一个Docker容器中运行的开发环境。
但是,在运行环境中,服务和python的虚拟环境(virtualenv
)都是以admin
用户身份运行的。如何在Docker中实现以admin
身份来构建环境呢?
最初我想到的是sudo
,也就是使用sudo -i -u admin "virtualenv venv2"
来构建(模拟日常在shell终端中的操作)。但是,实际在Dockerfile
中使用指令:
RUN sudo -i -u admin "virtualenv venv2"
则会提示错误-bash: virtualenv venv2: command not found
。
原来Docker内建了切换用户身份来运行指令的命令User
,实际上不要使用sudo
,格式如下:
USER admin
RUN virtualenv /home/admin/venv2
在
Dockerfile
中每次使用User
指令都会切换一次执行身份。所以,如果后面又需要切换回root
身份的话,还要使用一次User
指令。
完整的构建Python 2.7的virtualenv环境Dockerfile
:
FROM docker.io/centos:7
MAINTAINER vincent huatai <[email protected]>
RUN yum clean all
RUN yum -y update
RUN yum -y install which sudo nmap-ncat mlocate net-tools rsyslog file ntp ntpdate \
wget tar bzip2 xz screen sysstat unzip nfs-utils lsof man bind-utils \
crontabs openssh-clients openssh-server initscripts
# install pip + virtualenv
RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7
RUN pip2.7 install virtualenv
# Prepare sshd host key
RUN ssh-keygen -A
# add account "admin" and give sudo privilege
RUN groupadd -g 505 admin
RUN useradd -g 505 -u 505 -d /home/admin -m admin
RUN usermod -aG wheel admin
RUN echo "%wheel ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# Add ssh public key for login
RUN mkdir -p /home/admin/.ssh
ADD authorized_keys /home/admin/.ssh/authorized_keys
RUN chown -R admin:admin /home/admin/.ssh
RUN chmod 600 /home/admin/.ssh/authorized_keys
RUN chmod 700 /home/admin/.ssh
# deploy python virtualenv, sudo to admin
USER admin
RUN virtualenv /home/admin/venv2
# run service sshd & bash console
USER root
EXPOSE 22
ENTRYPOINT /usr/sbin/sshd && /bin/bash
- 命令行运行
如果在在命令行运行多个命令,例如执行virtualenv中的python脚本,则需要使用 `/bin/bash -c "XXX;YYY;ZZZ"方式:
docker run \
--runtime=nvidia \
--rm \
-ti \
-v "${PWD}:/app" \
--user huatai \
local:tensorflow-cuda3.0 \
/bin/bash -c "cd /home/huatai; . venv3/bin/activate; \
python /app/benchmark.py cpu 10000"
--user
参数表示在容器中切换到huatai
用户身份;通过/bin/bash -c
可以在运行多条命令,这样可以切换Python的virtualenv环境,并执行python脚本。参考 docker run
Docker and Virtualenv? A clean way to locally install python dependencies with pip in Docker 提供了使用docker-compose
文件来构建Python virtualenv环境以及服务器部署的方法,后续再参考实践。