Docker撰写命令没有这样的文件

我一直试图containerize我的php wev应用程序(build立在laravel),但我遇到了几个问题

首先我发现容器在执行命令后退出,所以我将构build脚本移动到了不同的容器(迁移和作曲者安装)

我做了一个名为init.sh的脚本,其中包含构build指令,但每当我从docker-compose.ymlcommand运行它们时,我都没有这样的文件或目录。

这是我的dockerfile

 FROM nimmis/apache-php7 COPY apache_default /etc/apache2/sites-available/000-default.conf RUN a2enmod rewrite RUN service apache2 restart 

这是我的docker-compose.ym

 version: "3" volumes: db-data: external: false services: db: image: mysql/mysql-server env_file: .env volumes: - db-data:/var/lib/mysql-server migrations: build: . env_file: .env volumes: - .:/var/www/html/books depends_on: - app command: # - /var/www/html/books/artisan migrate # - chmod 777 /var/www/html/init.sh - /var/www/html/books/init.sh # - /var/www/html/init.sh environment: - ALLOW_OVERRIDE=true app: build: . env_file: .env volumes: - .:/var/www/html/books ports: - "8081:80" depends_on: - db environment: - ALLOW_OVERRIDE=true 

注释部分不同的尝试正确运行脚本。

我试图使用docker工具箱在Windows 10上运行它

我究竟做错了什么? 这是正确的方法吗?

RUN指令将在容器正在构build时执行容器中的某些内容,而不是在容器正在执行时执行。

为此,你的Dockerfile应该看起来更像这样:

 FROM nimmis/apache-php7 COPY apache_default /etc/apache2/sites-available/000-default.conf RUN a2enmod rewrite ENTRYPOINT ["bash", "/path/to/init.sh"] CMD ["apache2", "-DFOREGROUND", "-k", "start"] 

入口指令将在CMD指令之前运行,而不pipe在启动时将命令传入容器。

所以,你需要让init.sh执行容器传递给它的命令:

 #!/bin/bash # init.sh # todo: whatever init.sh does... # Execute the CMD passed to the container: exec "$@" 

而不是这个

  volumes: - .:/var/www/html/books 

使用

  volumes: - folder_containg_sh:/var/www/html/books #relative path to script 

在docker-compose文件中

所以我找出了什么是错的…这是一个权限问题。

当我设置权限是可执行的,它工作正常…

所以现在我只需要调整我的dockerfile就可以了

 FROM nimmis/apache-php7 COPY . /var/www/html/books COPY start.sh / RUN chmod +x /start.sh COPY apache_default /etc/apache2/sites-available/000-default.conf RUN a2enmod rewrite RUN service apache2 restart