Сборка Дуги, которую изображение Докера Linux подвешивает - ВЫПОЛНЯЕТ pacman-Syyu - необходимый - noconfirm

Я пытаюсь создать пользовательское изображение Докера с помощью 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"]

Теперь, когда это добирается до части "ВЫПОЛНЕНИЯ", где это, как предполагается, обновляет, это подвешивает и производит это сообщение об ошибке:

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" выполняемый в контейнере. Это не должно действительно тормозить вещи, но это ясно.

0
задан 31 March 2015 в 09:44
1 ответ

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

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 во время сборки. Это может быть переопределено во время выполнения. Для этого есть параметр времени выполнения - add-host : https://docs.docker.com/reference/commandline/cli/#adding-entries-to-a-container- hosts-файл .
  • Вам не нужно устанавливать команду на / bin / sh -c . Docker действительно сделает это за вас, если вы просто передадите простую команду вне массива. См. Последнюю из трех форм CMD по адресу https://docs.docker.com/reference/builder/#cmd .
1
ответ дан 4 December 2019 в 17:00

Теги

Похожие вопросы