Назад | Перейти на главную страницу

Сборка образа Docker для Arch linux зависает - RUN pacman -Syyu --needed --noconfirm

Я пытаюсь создать собственный образ Docker с помощью файла Dockerfile. Я использую базовое изображение:

l3iggs / archlinux

Мой Dockerfile выглядит так:

FROM l3iggs/archlinux:latest

COPY source /srv/visitor

WORKDIR /srv/visitor

RUN pacman -Syyu --needed --noconfirm &&
        pacman -S --needed --noconfirm cronie nodejs phantomjs &&
        printf "1.2.3.4 www.hahaha.org \n" >> /etc/hosts &&
        printf "*/2 * * * *       node /srv/visitor/visitor.js \n" >> cronJobs &&
        printf "*/5 * * * *       killall -older-than 5m phantomjs \n" >> cronJobs &&
        printf "0 0 * * * rm /srv/visitor/visitor-info.log \n" >> cronJobs &&
        crontab cronJobs &&
        rm cronJobs &&
        npm install

EXPOSE 80

CMD ["/bin/sh", "-c"]

Теперь, когда он доходит до части «RUN», где он должен обновиться, он зависает и выводит это сообщение об ошибке:

Step 3 : RUN pacman -Syyu --needed --noconfirm &&
 ---> Running in ae19ff7ca233
/bin/sh: -c: line 1: syntax error: unexpected end of file
INFO[0013] The command [/bin/sh -c pacman -Syyu --needed --noconfirm &&] returned a non-zero code: 1

Любые идеи?

ОБНОВЛЕНИЕ 1:

Теперь я подозреваю, что моя проблема больше связана с командой «RUN», чем с выполнением «pacman -Syyu» внутри контейнера. Это действительно не должно тормозить, но очевидно, что это так.

Вам не хватает \ для построения вашей команды из нескольких строк. Команда запуска должна выглядеть примерно так:

RUN pacman -Syyu --needed --noconfirm && \
        pacman -S --needed --noconfirm cronie nodejs phantomjs && \
        printf "1.2.3.4 www.hahaha.org \n" >> /etc/hosts && \
        printf "*/2 * * * *       node /srv/visitor/visitor.js \n" >> cronJobs && \
        printf "*/5 * * * *       killall -older-than 5m phantomjs \n" >> cronJobs && \
        printf "0 0 * * * rm /srv/visitor/visitor-info.log \n" >> cronJobs && \
        crontab cronJobs && \
        rm cronJobs && \
        npm install

Однако следует отметить пару моментов:

  • Вы запускаете crontab как команду в процессе сборки. Это не будет запущено, когда вы запустите фактическое изображение.
  • Вы добавляете запись hosts во время сборки. Это может быть переопределено во время выполнения. Eсть --add-host параметр времени выполнения для этого: https://docs.docker.com/reference/commandline/cli/#adding-entries-to-a-container-hosts-file.
  • Вам не нужно устанавливать свою команду на /bin/sh -c. Docker на самом деле сделает это за вас, если вы просто передадите простую команду за пределами массива. Посмотреть последний из трех CMD формы в https://docs.docker.com/reference/builder/#cmd.