Вы можете попробовать:
data = pd.merge(df1,df2, on=['DAY'], how='outer')
Вы добавляете пользователя ros
в группу sudo
, но пытаетесь apt-get update
, не используя sudo. Поэтому вы запускаете команду непривилегированным и получаете permission denied
.
Используйте действительно выполнить команду (t):
FROM ros:kinetic-robot-xenial
RUN whoami
RUN apt-get update
# create non-root user
RUN apt-get install sudo
RUN echo "ros ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers
ENV USERNAME ros
RUN adduser --ingroup sudo --disabled-password --gecos "" --shell /bin/bash --home /home/$USERNAME $USERNAME
RUN bash -c 'echo $USERNAME:ros | chpasswd'
ENV HOME /home/$USERNAME
USER $USERNAME
RUN whoami
RUN sudo apt-get update
В целом, это не имеет особого смысла. Можно подготовить образ докера (например, установить программное обеспечение и т. Д.) С правами пользователя root. Если вы беспокоитесь о безопасности (что хорошо), оставьте материал sudo и убедитесь, что процесс (ы), которые запускаются при выполнении образа (например, создается контейнер), с вашим непривилегированным пользователем ...
Также рассмотрите возможность многоэтапной сборки, если вы хотите отделить подготовку образа от фактической работоспособной вещи:
https://docs.docker.com/develop/develop-images/multistage -Build /
apt-get
обычно нужно запускать с правами root, но после запуска команды USER
команды больше не запускаются с правами root.
Вы будете часто запускать такие команды при запуске в Dockerfile: если вы хотите, вы можете воспользоваться преимуществами кэширования слоя Docker, и вы, как правило, будете устанавливать зависимости в остальной части Dockerfile необходимо. Также по причинам кэширования слоев важно запустить apt-get update
и другие этапы установки за один шаг. Таким образом, ваш Dockerfile обычно будет выглядеть как
FROM ros:kinetic-robot-xenial
# Still root
RUN apt-get update \
&& apt-get install ...
# Copy in application (still as root, won't be writable by other users)
COPY ...
CMD ["..."]
# Now as the last step create a user and default to running as it
RUN adduser ros
USER ros
Если вам нужно, вы можете явно USER root
переключиться обратно на root для последующих команд, но обычно легче читать и поддерживать Dockerfile с меньшим количеством пользовательских переключений.
Также обратите внимание, что ни sudo
, ни пользовательские пароли действительно бесполезны в Docker. В общем, сложно запустить sudo
в сценарии, и в сценариях происходит много вещей, связанных с Docker. Контейнеры также почти никогда не запускают такие вещи, как getty
или sshd
, которые потенциально могут принимать пользовательские пароли, и их тривиально читать из docker history
, поэтому нет смысла их устанавливать. И наоборот, если вы можете получить оболочку в контейнере, вы всегда можете передать -u root
команде docker run
или docker exec
, чтобы получить корневую оболочку.
Попробуйте поместить эту строку в конец вашего dockerfile
USER $ USERNAME (как только эта строка появится в dockerfile ... вы примете права этого пользователя ... которые в этом случае устанавливать не нужно что угодно) по умолчанию вы root (111)