我正在尝试使用 Dockerfile 构建自定义 Docker 映像。我使用的基准映像是这个:
我的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”有关。这实际上不应该造成影响,但显然是。
答案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 作为命令运行。运行实际映像时不会运行该命令。
- 您正在构建期间添加主机条目。这可能会在运行时被覆盖。有一个
--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。