为什么我的Dockerfile中声明的USER不能反映在ENTRYPOINT脚本中?

时间:2019-05-30 10:03:05

标签: docker jenkins

我正在尝试修复一些我们在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。

1 个答案:

答案 0 :(得分:0)

正如David Maze在评论中指出的那样,我遇到的问题是我在实际构建容器时通过docker-compose文件设置用户。我已经将user参数设置为${DOCKER_UID},但实际上从未在任何地方设置它,因此它默认为空字符串。将其设置为2000可以解决我的问题。