【发布时间】:2020-04-13 17:02:04
【问题描述】:
我有下面的 Dockerfile 来创建一个 nodejs 服务器。它克隆了一个包含启动节点服务器的脚本的存储库,但该脚本需要是可执行的。
我第一次启动这个 docker 容器时,它按预期工作。我知道 chown 正在做某事,因为没有它,脚本“不存在”,因为它没有 x 权限。 但是,如果我随后在容器中打开一个 TTY 并检查该文件,则权限并没有改变。如果容器重新启动,则会给出文件不存在的错误(缺少 x 权限)。如果我在第一次运行后手动执行 chmod,我可以毫无问题地重新启动容器。
我已经尝试将它作为组合 RUN 命令的一部分(如下所示)和单独的 RUN 命令,两者都正常编写和RUN ["chmod", "755" "/opt/youtube4me/start_all.sh"] 以及755 和+x。所有这些方式在第一次启动时都有效,但不会永久更改权限。
我对 docker 很陌生,我认为我缺少一些基本概念来解释 chmod 在某种上下文中运行(也许?)
FROM node:10.19.0-alpine
RUN apk update && \
apk add git && \
git clone https://github.com/0502-crew/youtube4me.git /opt/youtube4me && \
chmod 755 /opt/youtube4me/start_all.sh
COPY config/. /opt/youtube4me/
EXPOSE 45011
WORKDIR /opt/youtube4me
CMD ["/opt/youtube4me/start_all.sh"]
更新 1 我用 docker 运行这些命令:
sudo docker build . -t 0502-crew/youtube4mesudo docker container run -d --name youtube4me --network host 0502-crew/youtube4me
start_all.sh
#!/bin/sh
# Reset to master in case any force pushes were done
git reset --hard origin/master
# Start client server
cd client && npm i && npm run build && nohup npm run prod &
# Start api server
cd api && npm i && npm run build && nohup npm run prod &
# Keep server running by tailing nothing, forever...
tail -f /dev/null
我从中复制的配置文件夹仅包含 .gitignore 中的 2 个 .ts 文件,因此需要手动添加:
- config/api/src/config/Config.ts
- config/client/src/config/Config.ts
更新 2
如果我用CMD ["sh", "-c", "tail -f /dev/null"] 替换 CMD 行,那么 x 权限将保留在 sh 文件中。似乎执行脚本会删除权限...
【问题讨论】:
-
您是否有可能在
config中也有一个start_all.sh? -
你是如何运行容器的?
start_all.sh的内容是什么(特别是它的第一行#!是什么,它是否退出)? -
我已经更新了这个问题。配置中没有任何影响这一点(很确定这个问题在我添加配置副本之前发生)并且 start_all.sh 使用 sh 因为图像没有 bash。同样,脚本在我第一次启动容器时完美运行,但之后却没有。
标签: docker