Я пытаюсь исправить некоторые тесты, которые мы выполняем на Jenkins с Docker, но сценарий, на который указывает ENTRYPOINT
в моем Dockerfile, продолжает работать как root, хотя я установил USER
в 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
и я понимаю, что эта проблема обычно решается путем установки команды USER
в Dockerfile, но я делаю это, и похоже, что он переключает пользователя при запуске самого 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 в файле переопределения