Dockerfile中的chmod不会永久更改权限

Dockerfile中的chmod不会永久更改权限,docker,Docker,我有下面的Dockerfile来创建nodejs服务器。它克隆一个repo,其中包含启动节点服务器的脚本,但该脚本需要是可执行的 我第一次启动这个docker容器时,它按预期工作。我知道chown正在做一些事情,因为没有它,脚本“不存在”,因为它没有x权限。 但是,如果我随后在容器中打开一个TTY并检查该文件,则权限没有更改。如果重新启动容器,则会出现文件不存在的错误(缺少x权限)。如果在第一次运行后手动执行chmod,则可以重新启动容器而不会出现问题 我已经将其作为组合运行命令(如下所示)的一

我有下面的Dockerfile来创建nodejs服务器。它克隆一个repo,其中包含启动节点服务器的脚本,但该脚本需要是可执行的

我第一次启动这个docker容器时,它按预期工作。我知道chown正在做一些事情,因为没有它,脚本“不存在”,因为它没有x权限。 但是,如果我随后在容器中打开一个TTY并检查该文件,则权限没有更改。如果重新启动容器,则会出现文件不存在的错误(缺少x权限)。如果在第一次运行后手动执行chmod,则可以重新启动容器而不会出现问题

我已经将其作为组合运行命令(如下所示)的一部分和单独的运行命令进行了尝试,这两种命令都是正常编写的,也都是作为
RUN[“chmod”,“755”“/opt/youtube4me/start_all.sh”
编写的,并且都是使用
755
+x
编写的。所有这些方法在第一次启动时都有效,但不会永久更改权限

我对docker很陌生,我想我缺少了一些基本的概念来解释chmod是在某种上下文中运行的(也许?)

更新1 我使用docker运行以下命令:

  • sudo docker构建-t 0502乘员/youtube4me
  • sudo docker容器运行-d--名称youtube4me--网络主机0502 crew/youtube4me
开始

#!/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文件上。执行脚本似乎会删除权限…

您正在为从git提取的项目构建docker文件,并且您的start\u all脚本包含一个
git reset--hard origin/master
,这是一个糟糕的做法,因为现在您无法创建docker映像的版本

您还将这两个文件复制到错误的目录。使用
copyconfig//选择/youtube4me/
直接将它们复制到项目的rood。而不是到
config/api/src/config/
config/client/src/config/config.ts中的给定位置

我意识到解决这些问题本身并不能解决chmod问题。但它可能会使您的特定用例不再需要它

此外,如果您从git中排除了这些秘密,您也不应该在构建docker映像时将它们添加到docker映像中,因为(在您将其推送到docker之后),它将再次公开。因此,最好不要在构建时添加它们

你有没有试过这样的方法:

Docker文件

FROM node:10.19.0-alpine

RUN mkdir /opt/youtube4me    
COPY . /opt/youtube4me/
WORKDIR /opt/youtube4me

RUN chmod 755 /opt/youtube4me/start_all.sh

EXPOSE 45011
CMD ["/opt/youtube4me/start_all.sh"]
dockrignore

FROM node:10.19.0-alpine

RUN mkdir /opt/youtube4me    
COPY . /opt/youtube4me/
WORKDIR /opt/youtube4me

RUN chmod 755 /opt/youtube4me/start_all.sh

EXPOSE 45011
CMD ["/opt/youtube4me/start_all.sh"]
脚本

# 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
然后,您需要使用2个卷运行docker run以将配置添加到其中。这是用-v完成的。示例:
docker run-v$(pwd)config/api/src/config/:api/src/config/-v$(pwd)config/client/src/config/:client/src/config/

然而,我想知道为什么您在一个docker映像中运行这两个服务。如果这只是为了本地执行,您还可以考虑创建两个单独的docker映像,并使用docker compose生成所有这些映像

添加1:

我对此进行了一些思考,使用环境变量来配置docker映像而不是向其添加文件也是一种很好的做法。你可能也想换成那样。我建议读者更好地理解为什么要这样做以及其他可能的做法

添加2:
我创建了一个,这是一个docker compose的示例。由于配置选项,它当前未生成。但是它会给你更多的见解。

你正在为你从git中提取的项目构建一个docker文件,你的start\u all脚本包括一个
git重置--hard origin/master
,这是一个糟糕的做法,因为现在你无法创建docker映像的版本

您还将这两个文件复制到错误的目录。使用
copyconfig//选择/youtube4me/
直接将它们复制到项目的rood。而不是到
config/api/src/config/
config/client/src/config/config.ts中的给定位置

我意识到解决这些问题本身并不能解决chmod问题。但它可能会使您的特定用例不再需要它

此外,如果您从git中排除了这些秘密,您也不应该在构建docker映像时将它们添加到docker映像中,因为(在您将其推送到docker之后),它将再次公开。因此,最好不要在构建时添加它们

你有没有试过这样的方法:

Docker文件

FROM node:10.19.0-alpine

RUN mkdir /opt/youtube4me    
COPY . /opt/youtube4me/
WORKDIR /opt/youtube4me

RUN chmod 755 /opt/youtube4me/start_all.sh

EXPOSE 45011
CMD ["/opt/youtube4me/start_all.sh"]
dockrignore

FROM node:10.19.0-alpine

RUN mkdir /opt/youtube4me    
COPY . /opt/youtube4me/
WORKDIR /opt/youtube4me

RUN chmod 755 /opt/youtube4me/start_all.sh

EXPOSE 45011
CMD ["/opt/youtube4me/start_all.sh"]
脚本

# 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
然后,您需要使用2个卷运行docker run以将配置添加到其中。这是用-v完成的。示例:
docker run-v$(pwd)config/api/src/config/:api/src/config/-v$(pwd)config/client/src/config/:client/src/config/

然而,我想知道为什么您在一个docker映像中运行这两个服务。如果这只是为了本地执行,您还可以考虑创建两个单独的docker映像,并使用docker compose生成所有这些映像

添加1:

我对此进行了一些思考,使用环境变量来配置docker映像而不是向其添加文件也是一种很好的做法。你可能也想换成那样。我建议读者更好地理解为什么要这样做以及其他可能的做法

添加2: 我创建了一个,这是一个docker compose的示例。它当前未生成,因为
git commit -m"Made sh executable"