我是Docker的新手,正在尝试将应用程序移植到它上面。本质上,在启动时,该应用程序需要执行一些我封装在脚本中的与环境相关的工作。
我的应用看起来像
Dockerfile
scripts/run.sh
build-development/stuff
build-production/stuff
Run Code Online (Sandbox Code Playgroud)
这是我的Dockerfile:
FROM nginx
RUN chmod +x scripts/run.sh
CMD ["scripts/run.sh", APP_ENV]
EXPOSE 80
Run Code Online (Sandbox Code Playgroud)
这是脚本/ 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
Run Code Online (Sandbox Code Playgroud)
我的想法是,我将像这样运行图像:
docker run -e APP_ENV=development app-name
Run Code Online (Sandbox Code Playgroud)
并将其输入脚本中,该脚本将复制正确的文件。
不幸的是,我从未运行过该映像,因为在构建步骤中:
docker build -t app-name .
Run Code Online (Sandbox Code Playgroud)
我收到有关的错误
scripts / run.sh不是文件或目录
我不明白为什么会收到此错误,我想这是我天真的误解造成的。我在做错什么,如何使我的项目正常进行?
提前致谢。
似乎您想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]
Run Code Online (Sandbox Code Playgroud)
这将复制./scripts/run.sh(相对于您的构建目录)成图像/scripts/run.sh,所以你后来RUN和CMD有可用的路径。
我遇到的问题是我正在Windows中进行编辑,这会将字符'/ r'添加到新行中。这会导致SH错误,但不会导致bash错误。我花了好几个小时才弄清楚。另一个问题是制表符和空格,这在运行命令时也把外壳扔掉了。
只是想出我要补充的内容,因为那是我得到的错误的问题。
如果您使用的是notepad ++,则实际上可以更改行尾和文本编码。我通常会切换到ANSI和Unix行尾以确保Shell不会抛出错误。
否则,仅当在Windows行尾中添加编辑时,一切工作正常。不知道为什么shell无法处理多余的行尾,但这可能是其他人在遇到错误时遇到的问题:没有这样的文件。我还必须确保我的docker文件即使脚本最初是在linux中设置的,也要在脚本中添加+ x,因为Windows有时会将它们弄乱,所以我必须明确使用脚本,以确保我还是某人否则正在将dockerfile /文件下载到他们的计算机,他们不会失去可执行权限。
在某些情况下,当目录或文件被添加进来时.dockerignore,会导致这个问题......
所以打开或 vi 你.dockerignore并确保目录或文件没有添加到那里......
并docker build .再次运行..
| 归档时间: |
|
| 查看次数: |
23685 次 |
| 最近记录: |