我正在尝试修复一些我们在Docker上在Jenkins上运行的测试,但是即使我将ENTRYPOINT
设置为,我Dockerfile中的USER
指向的脚本仍以root身份运行。 Dockerfile。在我的本地计算机上运行正常,但在我们的Jenkins机器上运行时却无法正常运行。
我尝试在入口点脚本中运行su
,以确保脚本的其余部分以正确的用户身份运行,但它们仍以root用户身份运行。
所以我的Dockerfile看起来像这样:
FROM python:3.6
RUN apt-get update && apt-get install -y gettext libgettextpo-dev
ARG DOCKER_UID # set to 2000 in docker-compose file
ARG ENV=prod
ENV ENV=${ENV}
ARG WORKERS=2
ENV WORKERS=${WORKERS}
RUN useradd -u ${DOCKER_UID} -ms /bin/bash app
RUN chmod -R 777 /home/app
ENV PYTHONUNBUFFERED 1
ADD . /code
WORKDIR /code
RUN chown -R app:app /code
RUN mkdir /platform
RUN chown -R app:app /platform
RUN pip install --upgrade pip
RUN whoami # outputs `root`
USER app
RUN whoami # outputs `app`
RUN .docker/deploy/install_requirements.sh $ENV # runs as `app`
EXPOSE 8000
ENTRYPOINT [".docker/deploy/start.sh", "$ENV"]
我的start.sh
如下:
#!/bin/bash
ENV=$1
echo "USER"
echo `whoami`
echo Running migrations...
python manage.py migrate
mkdir -p static
chmod -R 0755 static
cd /code/
if [ "$ENV" == "performance-dev" ];
then
/home/app/.local/bin/uwsgi --ini .docker/deploy/uwsgi.ini -p 4 --uid app
else
/home/app/.local/bin/uwsgi --ini .docker/deploy/uwsgi.ini --uid app
fi
但是
echo "USER"
echo `whoami`
输出:
USER
root
这会导致脚本后面的命令由于错误的用户而失败。
除了输出是我
USER
app
我的理解是,通常可以通过在Dockerfile中设置USER
命令来解决此问题,但是我做到了,并且看起来它在运行Dockerfile本身时正在切换用户。
修改
问题出在我的docker-compose配置上。我的docker-compose配置如下:
version: '3'
services:
service:
user: "${DOCKER_UID}:${DOCKER_UID}"
build:
context: .
dockerfile: .docker/Dockerfile
args:
- ENV=prod
- DOCKER_UID=2000
DOCKER_UID
是在本地计算机上设置的变量,而不是在Jenkins框中设置的变量,因此我在覆盖文件中将其设置为2000。
答案 0 :(得分:0)
正如David Maze在评论中指出的那样,我遇到的问题是我在实际构建容器时通过docker-compose文件设置用户。我已经将user
参数设置为${DOCKER_UID}
,但实际上从未在任何地方设置它,因此它默认为空字符串。将其设置为2000
可以解决我的问题。