我是docker的新手并试图将应用程序移植到它上面。本质上,在启动时,应用程序需要执行一些依赖于环境的工作,我已将其封装在脚本中。
我的应用程序看起来像
Dockerfile
scripts/run.sh
build-development/stuff
build-production/stuff
这是我的Dockerfile:
FROM nginx
RUN chmod +x scripts/run.sh
CMD ["scripts/run.sh", APP_ENV]
EXPOSE 80
这里是脚本/ run.sh:
#!/bin/bash
mkdir dist
chmod -R 777 dist
if [ $1 == "development" ]
then
cp -R build-development/. /usr/share/nginx/html
fi
if [ $1 == "stage" ]
then
cp -R build-production/. /usr/share/nginx/html
sed -i 's/production/stage/g' dist/index.html
fi
if [ $1 == "production" ]
then
cp -R build-production/. /usr/share/nginx/html
fi
我的想法是运行图像:
docker run -e APP_ENV=development app-name
它将被输入到脚本中,该脚本将复制正确的文件。
不幸的是,我从来没有运行图像,因为在构建步骤中:
docker build -t app-name .
我收到有关
的错误scripts / run.sh不是文件或目录
我不明白为什么我会收到这个错误,我想这是我自己的天真误解。我做错了什么,我怎样才能使我的项目有效?
提前致谢。
答案 0 :(得分:5)
您似乎希望scripts/run.sh
成为容器的一部分。在这种情况下,在尝试运行chmod之前,需要将其复制到映像中。
FROM nginx
COPY scripts/run.sh /scripts/run.sh
RUN chmod +x /scripts/run.sh
CMD ["/scripts/run.sh", APP_ENV]
这会将./scripts/run.sh
(相对于您的构建目录)复制到/scripts/run.sh
的图片中,以便您的后期RUN
和CMD
可以使用该路径。
答案 1 :(得分:4)
我遇到的问题是,我在Windows中编辑,它将字符'/ r'添加到新行。这导致了SH的错误而不是bash。我花了好几个小时来解决这个问题。另一个问题是制表符与空格,这也是在运行命令时抛出shell。
我想补充一点,因为那是我遇到的错误的问题。
如果您使用的是notepad ++,您实际上可以更改行结尾和文本编码。我通常会切换到ANSI和unix行结尾,以确保shell不会抛出错误。
否则一切正常,只是在Windows行结尾的编辑中添加。不知道为什么shell无法处理额外的行结尾,但这可能是其他人遇到的错误,当他们得到错误时:没有这样的文件。我还必须确保我的docker文件正在向脚本添加+ x,即使它们最初是在linux中设置的,因为windows有时会混淆那些,所以我必须明确脚本,只是为了确保我或者某人否则就是将dockerfile / files下载到他们的计算机上,他们不会丢失可执行权限。
答案 2 :(得分:2)